整体来说,C#编写串口调试程序入门还是挺简单的,SerialPort.GetPortNames();就可以获取串口号,这些都不多讲,参考微软官网https://msdn.microsoft.com/zh-cn/library/system.io.ports.serialport(v=vs.110).aspx就懂了,最难解决的问题是串口线程与UI界面的消息传递问题,本人也正解决此问题。
因为串口接收数据需要一直处于监听状态,那么就需要启用的新的线程来专门监听,SerialPort类也都已经打包好了,不用再自己写了,当然大神也可以自己写。SerialPortDataReceived += comm_DataReceived;就可以将监听函数添加到已经写好的委托(事件)中去,当接收到数据时就会触发接收事件,在接收数据的comm_DataReceived方法中使用Invoke方式来订阅事件,如这样
this.Invoke((EventHandler)(delegate
{
foreach (byte b in buf)
{
this.textBox1.AppendText(b.ToString()+'\t');
}
}
就可以实现接收到的数据更新到界面中了,波特率为9600的时候这种方式很好,看起来也好理解,但到波特率达到115200的时候,且下位机不断给该串口发送数据的时候就不一样了,只要一打开串口,界面就卡死了,改了SerialPortReceivedBytesThreshold = 64; 也无效,默认该值为1,即接收到64字节后才触发事件还是不行。
有人说 通过共享内存的方式,在在主线程里用定时器去读取数据可以解决这问题,但感觉也不是太好,更多方法还在探索中。
尾注:委托和事件是C#里类似于指针一样高大上的东西,要会应用需要漫长的积累