C# winform 关于串口通信的问题,

zhangshuqiang123 2011-06-20 07:35:56
做了这么就得项目 都是关于串口通信的。

在串口通信过程中,以前因为协议命令少,我一直采用,发完命令,然后等待10ms(具体看需求),然后自己手动从串口读取数据。这次遇到问题了,因为协议命令比较多,连接了多台设备,采用广播的方式的来通信,

为了简单起见,我用了自带的 串口对象 触发的方式来接收数据
如下:
            comport.ReadTimeout = 30;
comport.ReceivedBytesThreshold = 5;
comport.DataReceived += new SerialDataReceivedEventHandler(comport_DataReceived);

因为要发的命令比较多,我只能在每次发之前,设置触发的字节数comport.ReceivedBytesThreshold = 5;来接收不同命令返回的数据。现在出问题了,有些命令我设置了15个字节触发一次,结果经常超时了。也没读到15个字节,但是用串口调试助手。却能接收到完整的15个字节。不知道为什么,硬件是没问题,要不然不会用串口调试助手就不会出问题。


同时,也想跟大家讨论一下,各位都是采用什么方式来接收,发送数据的?回家看帖!
...全文
339 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
马扎姐 2013-06-08
  • 打赏
  • 举报
回复
请问串口通信字节码是怎么算的呢? isOpen = false; bytes = new byte[9] { 0, 0x5a, 0x55, 0, 1, 2, 0, 0, 0xb3 }; sp.Write(bytes, 0, bytes.Length); sp.Close();
roman_2004 2013-04-08
  • 打赏
  • 举报
回复
C# winform 串口 IO硬件开发,qq:14503184,13910061508
lilin8905 2011-06-21
  • 打赏
  • 举报
回复
zhangshuqiang123 2011-06-21
  • 打赏
  • 举报
回复
说起来真简单[Quote=引用 6 楼 flyerwing 的回复:]
这就是个控件,拉一个写代码就好了.
[/Quote]
flyerwing 2011-06-21
  • 打赏
  • 举报
回复
这就是个控件,拉一个写代码就好了.
zhangshuqiang123 2011-06-21
  • 打赏
  • 举报
回复
那样的话,处理数据就乱掉的吧[Quote=引用 1 楼 jq_whh 的回复:]
在实际使用中,中断触发的字节数设为1,读的时候全部读完,避免因字节丢失时造成通信错误
[/Quote]
zhangshuqiang123 2011-06-21
  • 打赏
  • 举报
回复
那你有没有注意到,什么时候触发事件![Quote=引用 3 楼 tttyyylll 的回复:]
我用的是 事件驱动模式,发送事件,把sdtext.Text的文本用gb2312的编码方式转换成字节码;
接受方,用while处理,把字节码用gb2312的编码方式解码成String字符串,再把字符串显示到revtext.Text 里!
[/Quote]
孤月狼 2011-06-20
  • 打赏
  • 举报
回复
我用的是 事件驱动模式,发送事件,把sdtext.Text的文本用gb2312的编码方式转换成字节码;
接受方,用while处理,把字节码用gb2312的编码方式解码成String字符串,再把字符串显示到revtext.Text 里!
孤月狼 2011-06-20
  • 打赏
  • 举报
回复
我刚刚做了个串口通
 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;
}
信程序,
jq_whh 2011-06-20
  • 打赏
  • 举报
回复
在实际使用中,中断触发的字节数设为1,读的时候全部读完,避免因字节丢失时造成通信错误

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧