如今的串口通信主要应用在工控等领域,虽然不难,但是很多新人(包括一些老手)还是不能较好的实现 串口通信,下面简单谈谈串口通信,如果有更好补充的朋友,请不吝赐教,让本文成为串口通信文章的典范,更让大量的新手能正确掌握串口通信。
首先,大家必须知道串口通信的特性:串口发送和接收数据比较慢,以致一条命令数据的发送和接收可能需要多次操作发送或接收缓冲区。
下面我主要搜集一些网络上的串口通信文章或代码,然后点评,提出自己的看法。
帖子1: 在C#中使用SerialPort类实现串口通信(陆续更新)
http://blog.csdn.net/cy757/article/details/4474930 这篇文章写的很好,很有参考价值。
com.BaudRate = 115200;
com.PortName = "COM1";
这两句代码我点评一下,希望做UI的朋友提供友好的用户界面,对自己的传入数据的有效性控制也有帮助。1>串口波特率似乎只支持某几种档次如4800 | 9600 | 19200等等,所以希望UI做成选择控件ComboBox而不是用户输入数字的TextBox。2>”COM1”也做成选择,但还有两点a>可以考虑SerialPort.GetPortNames枚举本机存在的串口;b>如果打开了不存在的串口或者已经被打开的串口导致异常,一定要try捕获异常,不能让程序崩溃。
记住,接收数据有两种方式,1>使用事件接收;2>使用a>线程接收;b>定时器接收; 3>在任何地方,直接调用串口Read方法读数据,一定要杜绝Read永不返回导致卡死。
上文的private void ReadPort()线程函数有两点值得学习:
1> catch (TimeoutException) { }; //没有可以读取的字节异常
2> Thread.Sleep(waitTime)。 //不能操作串口缓冲区时,让时间片
记住,C#中跨线程访问控件很危险,坚决杜绝,请使用Invoke之类的函数同步访问。示例如private void serialPort1_DataReceived函数。
帖子2:C# 串口操作系列
http://blog.csdn.net/wuyazhe/article/details/5598945 里面5篇串口文章值得一看。
帖子3:基于C#实现PC机与AI调节器串口通信的实时监控系统
http://www.autooo.net/classid119-id57828.html 本文写的较好,应用场景、功能、方案都很棒,唯一可惜的最终实现及编码未能把多线程接收和解析串口数据部分源码贡献出来,可惜可惜!!
帖子4:借助VC++实现串口通讯程序中的多线程应用
http://www.ccw.com.cn/applic/prog/htm2003/20031211_13ZAR.htm
帖子5: 多线程串口通信技术在GPS导航中的应用(VC)
http://www.dzsc.com/data/html/2009-10-20/79533.html
CSerialPort类
帖子6:多串口多线程工业控制实现(CSerialPort类)
http://bbs.51cto.com/thread-417831-1.html 这篇文章写的非常棒,值得一看。
下面两行代码告诉我们多个串口设备轮询时的超时设置。
if((tNow - tLast)*1000 + (nNowMillSecond - nMillSecond[0]) > 800)9 x* g8 L4 N! R6 s0
pView->SetCommVal(); //发送下一台设备要数据命令或者进行其他的相关处理
帖子7: C#中SerialPort接了10个测温传感器,其接收事件只有一个,如果一个传感器出错,怎样不影响别的传感器正常接收
http://topic.csdn.net/u/20110518/21/9b0aec92-6c3f-43db-af02-8013db733210.html 这篇文章问题问的非常非常好,其次网友jsmouse贴的代码有些地方值得借鉴。
先分析jsmouse代码:
CRCData.CalculateCrc16(crcTemp, out CRCH, out CRCL);
if (buffer[10] != CRCH && buffer[11] != CRCL)
{
buffer.RemoveAt(0);
continue;//继续下一次循环
}
循环推进校验的方式值得借鉴。
帖子8:C#串口类SerialPort详解
波特率
ReadTimeout
ReceivedBytesThreshold
sp.DtrEnable = true; //如果是RS232转RS485,此句必须要,否则不能通讯