C# 串口通信
- 触发串口
触发串口
工作需要开发一个串口通讯的软件,我选择了C#语言,这里记录一下开发过程。
首先要申明一个串口:
using System.IO.Ports; //引入包public SerialPort serialPort = new SerialPort();
然后要打开一个串口,打开串口很简单,open就好了,但是要打开哪个串口呢,这个时候就需要先获取计算机拥有的串口:
string[] SpNum = SerialPort.GetPortNames();
我写的是winform程序,在界面上是用ComboBox来显示本机串口的,所以要把获得的串口名添加进ComboBox下拉列表中:
if (SpNum.Length != 0) //判断所获得的串口数不为0{for (int i = 0; i < SpNum.Length; i++){cbSelectCom00.Items.Add(SpNum[i]);cbSelectCom01.Items.Add(SpNum[i]);}}
在打开串口前,需要设置串口的属性,也就是波特率、数据位、校验位、停止位:
serialPort.DataBits = 8;serialPort.BaudRate = 9600;serialPort.Parity = Parity.None;serialPort.StopBits = StopBits.One;
选择一个要打开的串口,将它打开:
if (cbSelectCom00.SelectedItem == null) //判断是否选择了串口,如果没有选择{MessageBox.Show(\"请先选择物理端口!\", \"提示\", MessageBoxButtons.OK, MessageBoxIcon.Information);this.cbSelectCom00.Focus(); //将鼠标聚焦在当前控件上}else //如果选择了{try{if (cbSelectCom00.Enabled == true){pc0.serialPort.PortName = cbSelectCom00.SelectedItem.ToString();pc0.serialPort.Open(); //打开串口OpenCom00.Text = \"已打开\";cbSelectCom00.Enabled = false;OpenCom00.BackColor = System.Drawing.Color.Cyan;pc0.serialPort.ReceivedBytesThreshold = 1; //多少个字节触发DataReceived事件pc0.comtag = 0;pc0.serialPort.DataReceived += new SerialDataReceivedEventHandler(pc0.serialPort_DataReceived); //触发事件}else{pc0.serialPort.Close();OpenCom00.Text = \"打开\";OpenCom00.BackColor = Color.White;cbSelectCom00.Text = \"\";cbSelectCom00.Enabled = true;}}catch(Exception ex){MessageBox.Show(ex.ToString(), \"提示\", MessageBoxButtons.OK, MessageBoxIcon.Error);}}
serialPort.ReceivedBytesThreshold 是指接收到多少个字节后触发DataReceived事件;
public void serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e){//读取缓存区数据//将数据写入串口}
读取缓存区的数据:
Thread.Sleep(80);int n = serialPort.BytesToRead;byte[] buff = new byte[n];serialPort.Read(buff, 0, n);
将数据写入串口:
byte[] Rx = new byte[70];serialPort.Write(Rx, 0, Rx.Length);
注意:我们都希望理想的状态是串口有规律的收发字节,不要丢包,我尝试了之后,用的比较笨的方法,就是Thread.Sleep()让线程等一下,避免接收的数据被新接收的数据覆盖,避免当前的数据包还没发完又写入新的数据包,这个要通过自己不断的测试找到那个合适的等待的时间。