C#串口通信 serialport类
时间:2011-12-07
来源:互联网
我用C#中的serialport类做一个串口通信,遇到个问题,我查看了资料“通过调用一次serialport类中的Read()方法并不能确保所读取的数据就是完整一桢”,我现在就遇到这个问题,我用Read()方法只能得到我数据的前9个字节,后面的数据得不到,百思不得其解,望赐教!
Byte[] BSendTemp = { 0x00, 0xff, 0xff, 0xcc, 0x01, 0x01, 0x02, 0x40, 0x00, 0x44 }; //建立临时字节数组对象
serialPort.Write(BSendTemp, 0, 10);//发送命令
Thread.Sleep(4000);
int count = serialPort.BytesToRead;
//为什么我只能读到9byte的数据,我一共有50几byte,百思不得其解
byte[] BReceived = new byte[count];
serialPort.Read(BReceived, 0, count);
MessageBox.Show(count.ToString());
//显示读取的字节数
作者: hlxk11hlxk11 发布时间: 2011-12-07
Thread.Sleep(4000);
你既要发送数据,又要主线程休眠4秒,可能是你的数据还没有发送完,主线程就休眠了,造成后来从缓存区读出来的数据不全.其实你可以搞个定时器,设定时间为4000,然后在定时器触发时间中读串口的缓存.注意把电脑的DB9针的RS232口的2和3脚用短路块短起来.
作者: AOE1234567890 发布时间: 2011-12-07
作者: wuyazhe 发布时间: 2011-12-07
▪ 并行计算与云计算的关系?▪ 什么是AppUp云服务?▪ 私有云的优势是什么?▪ 大型企业的CIO们是如何看待云计...▪ 云计算基础架构是什么?
有个C#的问题想请教,在线等!!
我用C#中的serialport类做一个串口通信,遇到个问题,我查看了资料“通过调用一次serialport类中的Read()方法并不能确保所读取的数据就是完整一桢”,我现在就遇到这个问题,我用Read()方法只……
不用 Thread.Sleep(4000)的话就读不到数据,定时器我没用过,我查下资料
作者: hlxk11hlxk11 发布时间: 2011-12-07
作者: wuyazhe 发布时间: 2011-12-07
作者: hlxk11hlxk11 发布时间: 2011-12-07
接下来你如果再读,能读回更多?
再读的话,还是只读到前9个字节
作者: hlxk11hlxk11 发布时间: 2011-12-07
serialPort.Write(BSendTemp, 0, 10);//发送命令
Thread.Sleep(4000);
你既要发送数据,又要主线程休眠4秒,可能是你的数据还没有发送完,主线程就休眠了,造成后来从缓存区读出来的数据不全.其实你可以搞个定时器,设定时间为4000,然后在定时器触发时间中读串口的缓存.注意把电脑的DB9针的RS232口的2和3脚用短路块短起来.
如果不延时的话,就读不到数据了。因为发送命令,下位机需要进行数据处理,才能传回数据
作者: hlxk11hlxk11 发布时间: 2011-12-07
在这个事件中使用SerialPort.ReadExisting 方法。
作者: chromeV8 发布时间: 2011-12-07
作者: aini1091 发布时间: 2011-12-08
private void serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e) { int bytes = 0; String strMoney = String.Empty;//钱数 String strNumber = String.Empty;//币数 String strMoneyAndNumber = String.Empty;//钱数+币数 bytes = serialPort.BytesToRead;//读取串口中的数据 byte[] buffer = new byte[bytes];//转换成数组 for (int i = 0; i < bytes; i++) { buffer[i] = (byte)(serialPort.ReadByte());//循环遍历每个元素 } if (bytes != 0)//判断数组是否为0 {.......}
作者: aini1091 发布时间: 2011-12-08
作者: mjp1234airen4385 发布时间: 2011-12-08
▪ 云计算和云存储的关系?▪ 主流PaaS开放平台——谁是最通...▪ 解析存储虚拟化的不同应用?▪ ERP财务系统和云计算▪ 移动云计算和云计算有什么区别?有个C#的问题想请教,在线等!!
我用C#中的serialport类做一个串口通信,遇到个问题,我查看了资料“通过调用一次serialport类中的Read()方法并不能确保所读取的数据就是完整一桢”,我现在就遇到这个问题,我用Read()……
串口是一位一位地传输的,当你正在读的时候可能数据还没有完全传到接收缓冲区,所以你只能读到部位数据。因此需要足够长的延时来等待数据全部传输完成。你上面延时4秒再读的话可以把时间调长一点,这样不好估算时间,而且传输不同数量的字节延时长度如果长了是浪费,如果短了又无法接收完成,所以不建议直接用很长的延时。你上面发送命令后应该是等待一定时间,设备会回传数据给你,而设备响应的时间应该是可以估算的,然后再读取数据。帮你改了一下程序。
C# code
Byte[] BSendTemp = { 0x00, 0xff, 0xff, 0xcc, 0x01, 0x01, 0x02, 0x40, 0x00, 0x44 }; //建立临时字节数组对象 serialPort.Write(BSendTemp, 0, 10);//发送命令 Thread.Sleep(4000); // 等待设备响应。 int count; do { count = serialPort.BytesToRead; // 读取缓冲区数据长度 Thread.Sleep(10); // 延时10毫秒 } while (count != serialPort.BytesToRead); // 判断刚才读取的长度与缓冲区长度相同表示已经接收完成,如果不同则将缓冲区长度赋给cout再延时10毫秒判断 serialPort.Read(BReceived, 0, count); MessageBox.Show(count.ToString());
作者: xmxqiyan 发布时间: 2011-12-08
引用楼主 hlxk11hlxk11 的回复:
▪ 云计算和云存储的关系?▪ 主流PaaS开放平台——谁是最通...▪ 解析存储虚拟化的不同应用?▪ ERP财务系统和云计算▪ 移动云计算和云计算有什么区别?有个C#的问题想请教,在线等!!
我用C#中的serialport类做一个串口通信,遇到个问题,我查看了资料“通过调用一次serialport类中的Read()方法并不能确保所读取的数据就是完……
关键是count = serialPort.BytesToRead; // 读取缓冲区数据长度
这个值还是9,
您的这个方法可以确定每次都将缓存区的数据都读到!还是没有办法解决无法接受50个字节的问题
作者: hlxk11hlxk11 发布时间: 2011-12-08
引用 12 楼 xmxqiyan 的回复:
引用楼主 hlxk11hlxk11 的回复:
▪ 云计算和云存储的关系?▪ 主流PaaS开放平台——谁是最通...▪ 解析存储虚拟化的不同应用?▪ ERP财务系统和云计算▪ 移动云计算和云计算有什么区别?有个C#的问题想请教,在线等!!
我用C#中的serialport类做一个串口通信,遇到个问题,我查看了资料“通过调用一次serialport类……
你看一下是不是你的串口控件把接收缓冲区大小设置成9字节了,如果不是可以先用串口调试助手看一下能接收到多少数据
作者: xmxqiyan 发布时间: 2011-12-08
C# code
System.IO.MemoryStream ms = new System.IO.MemoryStream(100); void serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e) { byte[] bytes = new byte[100]; int count = serialPort.Read(bytes, 0, 100); ms.Write(bytes, 0, count); }
使用:
C# code
Byte[] BSendTemp = { 0x00, 0xff, 0xff, 0xcc, 0x01, 0x01, 0x02, 0x40, 0x00, 0x44 }; //建立临时字节数组对象 ms.Position = 0; --将内存流重置 serialPort.Write(BSendTemp, 0, 10);//发送命令
查看(添加一个按钮,点击查看,防止线程阻塞):
C# code
MessageBox.Show(ms.Position.ToString());--内存流当前位置就是接收到的字节数
作者: qldsrx 发布时间: 2011-12-08
该回复于2011-12-08 13:50:06被管理员删除
- 对我有用[0]
- 丢个板砖[0]
- 引用
- 举报
- 管理
- TOP
|
#17楼 得分:0回复于:2011-12-11 10:53:24
|
作者: jhdxhj 发布时间: 2011-12-08
引用 13 楼 hlxk11hlxk11 的回复:
引用 12 楼 xmxqiyan 的回复:
引用楼主 hlxk11hlxk11 的回复:
▪ 云计算和云存储的关系?▪ 主流PaaS开放平台——谁是最通...▪ 解析存储虚拟化的不同应用?▪ ERP财务系统和云计算▪ 移动云计算和云计算有什么区别?有个C#的问题想请教,在线等!!
我用C#中的serialport类做一个串口通信,遇到……
串口精灵可以收到59个字节,自己写的只能收到9个,要不是有这个串口精灵,我会以为是下位机只发回了9个字节,可是事实上有59个之多,而我只能收到9个。ReceivedBytesThreshold属性设置大点没有效果,改了之后的效果就是出现了重复多次出现相同的9个字节!
作者: hlxk11hlxk11 发布时间: 2011-12-11
初始化(自行在构造函数中注册serialPort_DataReceived事件):
C# code
System.IO.MemoryStream ms = new System.IO.MemoryStream(100);
void serialPort_DataReceived(object sender, SerialDataReceivedEv……
非常感谢,可是调试了下
int count = serialPort.Read(bytes, 0, 100);
此时的count就只有9,所以···
要不是有串口精灵,我会以为是下位机只发回了9个字节,可是事实上有59个之多,而我只能收到9个。ReceivedBytesThreshold属性设置大点没有效果,改了之后的效果就是出现了重复多次出现相同的9个字节!
作者: hlxk11hlxk11 发布时间: 2011-12-11
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28