/// <summary>
/// 初始化串口实例
/// </summary>
privatevoid InitialSerialPort()
{
try
{
string portName =this.cmbSerials.SelectedItem.ToString();
port =new SerialPort(portName, 9600);
port.Encoding = Encoding.ASCII;
port.DataReceived += port_DataReceived;
port.Open();
this.ChangeArduinoSendStatus(true);
}
catch (Exception ex)
{
MessageBox.Show("初始化串口发生错误:"+ ex.Message, "提示信息", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
/// <summary>
/// 关闭并销毁串口实例
/// </summary>
privatevoid DisposeSerialPort()
{
if (port !=null)
{
try
{
this.ChangeArduinoSendStatus(false);
if (port.IsOpen)
{
port.Close();
}
port.Dispose();
}
catch (Exception ex)
{
MessageBox.Show("关闭串口发生错误:"+ ex.Message, "提示信息", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
}
/// <summary>
/// 改变Arduino串口的发送状态
/// </summary>
/// <param name="allowSend">是否允许发送数据</param>
privatevoid ChangeArduinoSendStatus(bool allowSend)
{
if (port !=null&& port.IsOpen)
{
if (allowSend)
{
port.WriteLine("serial start");
}
else
{
port.WriteLine("serial stop");
}
}
}
/// <summary>
/// 从串口读取数据并转换为字符串形式
/// </summary>
/// <returns></returns>
privatestring ReadSerialData()
{
string value ="";
try
{
if (port !=null&& port.BytesToRead >0)
{
value = port.ReadExisting();
}
}
catch (Exception ex)
{
MessageBox.Show("读取串口数据发生错误:"+ ex.Message, "提示信息", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
return value;
}
/// <summary>
/// 在读取到数据时刷新文本框的信息
/// </summary>
privatevoid RefreshInfoTextBox()
{
string value =this.ReadSerialData();
Action<string> setValueAction = text =>this.txtInfo.Text += text;
if (this.txtInfo.InvokeRequired)
{
this.txtInfo.Invoke(setValueAction, value);
}
else
{
setValueAction(value);
}
}
boolean sendFlag =false;//指示是否允许通过串口发送数据
String serialString ="";//串口数据缓存字符串
//参考:http://arduino.cc/en/Reference/Serial
void setup()
{
pinMode(pinLed,OUTPUT);
Serial.begin(9600);
serialString.reserve(200);//初始化字符串
}
void loop()
{
int lightValue = analogRead(A0);//从A0口读取光线传感器的值
if(readCompleted)//判断串口是否接收到数据并完成读取
{
Serial.print("read value:");
Serial.println(serialString);//将读取到的信息发送给电脑
if(serialString =="serial start")//当读取到的信息是"serial start"时,设置发送标志设置为true
{
sendFlag =true;
}
elseif(serialString =="serial stop")//当读取到的信息是"serial stop"时,设置发送标志设置为false
{
sendFlag =false;
}
serialString ="";
}
if(sendFlag)//如果允许通过串口发送数据,则点亮LED并发送数据,否则关闭LED
digitalWrite(pinLed, HIGH);
Serial.print("light value:");
Serial.println(lightValue);
}
else
{
digitalWrite(pinLed, LOW);
}
delay(1000);//延时1000ms
}
void serialEvent()//串口事件处理方法,参考:http://arduino.cc/en/Tutorial/SerialEvent
{
while(Serial.available())//参考://arduino.cc/en/Serial/Available
{
char inChar = (char)Serial.read();
if(inChar !=' ')//以换行符作为读取结束标志
{
serialString += inChar;
}
else
{
readCompleted =true;
}
}
}