C# winform 关于串口通信的有关问题
C# winform 关于串口通信的问题,
做了这么就得项目 都是关于串口通信的。
在串口通信过程中,以前因为协议命令少,我一直采用,发完命令,然后等待10ms(具体看需求),然后自己手动从串口读取数据。这次遇到问题了,因为协议命令比较多,连接了多台设备,采用广播的方式的来通信,
为了简单起见,我用了自带的 串口对象 触发的方式来接收数据
如下:
因为要发的命令比较多,我只能在每次发之前,设置触发的字节数comport.ReceivedBytesThreshold = 5;来接收不同命令返回的数据。现在出问题了,有些命令我设置了15个字节触发一次,结果经常超时了。也没读到15个字节,但是用串口调试助手。却能接收到完整的15个字节。不知道为什么,硬件是没问题,要不然不会用串口调试助手就不会出问题。
同时,也想跟大家讨论一下,各位都是采用什么方式来接收,发送数据的?回家看帖!
------解决方案--------------------
在实际使用中,中断触发的字节数设为1,读的时候全部读完,避免因字节丢失时造成通信错误
------解决方案--------------------
我刚刚做了个串口通
做了这么就得项目 都是关于串口通信的。
在串口通信过程中,以前因为协议命令少,我一直采用,发完命令,然后等待10ms(具体看需求),然后自己手动从串口读取数据。这次遇到问题了,因为协议命令比较多,连接了多台设备,采用广播的方式的来通信,
为了简单起见,我用了自带的 串口对象 触发的方式来接收数据
如下:
- C# code
comport.ReadTimeout = 30; comport.ReceivedBytesThreshold = 5; comport.DataReceived += new SerialDataReceivedEventHandler(comport_DataReceived);
因为要发的命令比较多,我只能在每次发之前,设置触发的字节数comport.ReceivedBytesThreshold = 5;来接收不同命令返回的数据。现在出问题了,有些命令我设置了15个字节触发一次,结果经常超时了。也没读到15个字节,但是用串口调试助手。却能接收到完整的15个字节。不知道为什么,硬件是没问题,要不然不会用串口调试助手就不会出问题。
同时,也想跟大家讨论一下,各位都是采用什么方式来接收,发送数据的?回家看帖!
------解决方案--------------------
在实际使用中,中断触发的字节数设为1,读的时候全部读完,避免因字节丢失时造成通信错误
------解决方案--------------------
我刚刚做了个串口通
- C# code
private void send_Click(object sender, EventArgs e) { byte[] data = ASCIIEncoding.GetEncoding("gb2312").GetBytes(sdtext.Text.ToString()); if (mycomm.IsOpen) { mycomm.Write(data,0,data.Length); mycomm.WriteLine("\r"); } } //接收 private void mycomm_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e) { int DataLength = mycomm.BytesToRead;//获取接受缓冲区中数据的字节数 int i = 0; StringBuilder strb = new StringBuilder(); while (i < DataLength) { byte[] dbs = new byte[2048]; int len = mycomm.Read(dbs,0,2048);//从输入缓冲区中读取2048个字节,并将这些字节写入到dbs[]数组中 strb.Append(ASCIIEncoding.GetEncoding("gb2312").GetString(dbs, 0, len)); i += len; } revtext.Text += strb; }
------解决方案--------------------
我用的是 事件驱动模式,发送事件,把sdtext.Text的文本用gb2312的编码方式转换成字节码;
接受方,用while处理,把字节码用gb2312的编码方式解码成String字符串,再把字符串显示到revtext.Text 里!
------解决方案--------------------
传送门