在VS2010里,可以看系统分装的IO.Ports.SerialPort类:
虽然不能看到具体的函数实现,但是可以看到有那些函数,并且函数注释了其功能,对于SerialPort的初步学习很有用
- 新建C#WinForm项目后,可以拖放SerialPort控件
private System.IO.Ports.SerialPort COMM2;
- 拖放一个控件来显示当前可以打开的串口端口
string s;
COMM2.Close();
for (int i = 1; i < 32; i++)
{
s = "COM" + i.ToString();
COMM2.PortName = s;
SerialPort2.Items.Add(s);
try
{
COMM2.Open();
}
catch
{
SerialPort2.Items.Remove(s);
}
COMM2.Close();
}
//load current setting
COMM2.BaudRate = 115200;
COMM2.ReceivedBytesThreshold = 1;
COMM2.ReadTimeout = 10;
if (SerialPort2.Items.Count > 0)
{
SerialPort2.Text = SerialPort2.Items[0].ToString();
COMM2.PortName = SerialPort2.Items[0].ToString();
}
else
{
SerialPort2.Text = "";
COMM2.PortName = uPort2;
}
- 当需要向串口发送数据的时候的发送操作
private void Send_Data()
{
int length = uScanCode.Length;
byte[] sn = new byte[length + 4];
byte totalsum = 0;
byte checksum = 0;
sn[0] = 0xAA;
sn[1] = (byte)(0xff & (length + 4));
sn[2] = 0xEE;
for (int i = 0; i < length; i++)
{
sn[i + 3] = (byte)(0xff & uScanCode[i]);
totalsum += (byte)(0xff & uScanCode[i]);
}
checksum = (byte)(0xff - (byte)(0xff & totalsum) - sn[0] - sn[1] - sn[2]);
sn[length + 3] = checksum;
if (uRS232Connect)
{
return_flag = false;
COMM2.Write(sn, 0, length + 4);
while (!return_flag)
{
Delay(100);
}
return_flag = false;
}
}
- 数据接受的多线程接收函数处理,只要在SerialPort控件上绑定一个多线程接收函数就可以了
//
// COMM2
//
this.COMM2.PortName = "COM2";
this.COMM2.DataReceived += new System.IO.Ports.SerialDataReceivedEventHandler(this.COMM2_DataReceived);
private void COMM2_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
System.Threading.Thread.Sleep(200);
try
{
int DataLength = COMM2.BytesToRead;
byte[] data = new byte[DataLength];
int len = COMM2.Read(data, 0, DataLength);
//校验获取的数据是否正确
byte checksum = 0;
for (int i = 0; i < len; i++)
{
checksum += (byte)(0xff & data[i]);
}
//获取TV网络MAC地址
if ((len == data[1])&&(checksum == 0xff))
{
return_flag = true;
sReciebeData = System.Text.Encoding.Default.GetString(data);
this.Invoke((EventHandler)(delegate
{
this.Status.Text = uScanCode + "成功存入TV,谢谢!";
}));
}
if ((len == 4) && (data[0] == 0x4E) && (data[1] == 0x47) && (data[2] == 0x4E) && (data[3] == 0x47))
{
return_flag = false;
Status.Text = "失败,请再扫描一次!";
}
}
catch
{
this.BeginInvoke(new MethodInvoker(delegate()
{
COMM2.Close();
uRS232Connect = false;
//Console.WriteLine("串口连接出错2,请检查连线! ");
MessageBox.Show("串口连接出错2,请检查连线! ");
}));
}
}