C#串口通信 serialport类

hlxk11hlxk11 2011-12-07 10:03:45
有个C#的问题想请教,在线等!!
我用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());
//显示读取的字节数
...全文
406 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
xmxqiyan 2011-12-16
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 hlxk11hlxk11 的回复:]

引用 14 楼 xmxqiyan 的回复:
引用 13 楼 hlxk11hlxk11 的回复:

引用 12 楼 xmxqiyan 的回复:
引用楼主 hlxk11hlxk11 的回复:
▪ 云计算和云存储的关系?▪ 主流PaaS开放平台——谁是最通...▪ 解析存储虚拟化的不同应用?▪ ERP财务系统和云计算▪ 移动云计算和云计算有什么区别?有个C#的问题想请教,在线等!!
我用C……
[/Quote]
你的9字节到底是你发送的数据的前面9字节还是后面9字节或者是中间9字节
Thread.Sleep(4000);
可以适当地调试一个这个Sleep的参数看看有什么变化。
jhdxhj 2011-12-16
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 hlxk11hlxk11 的回复:]
引用 15 楼 qldsrx 的回复:
初始化(自行在构造函数中注册serialPort_DataReceived事件):

C# code


System.IO.MemoryStream ms = new System.IO.MemoryStream(100);
void serialPort_DataReceived(object sender, SerialDataRecei……
[/Quote]
ding
slcmcu 2011-12-16
  • 打赏
  • 举报
回复
通讯线程要与界面线程分开,我做串口通讯的时候就遇到这个问题
hlxk11hlxk11 2011-12-11
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 qldsrx 的回复:]
初始化(自行在构造函数中注册serialPort_DataReceived事件):

C# code


System.IO.MemoryStream ms = new System.IO.MemoryStream(100);
void serialPort_DataReceived(object sender, SerialDataReceivedEv……
[/Quote]
非常感谢,可是调试了下
int count = serialPort.Read(bytes, 0, 100);
此时的count就只有9,所以···
要不是有串口精灵,我会以为是下位机只发回了9个字节,可是事实上有59个之多,而我只能收到9个。ReceivedBytesThreshold属性设置大点没有效果,改了之后的效果就是出现了重复多次出现相同的9个字节!
hlxk11hlxk11 2011-12-11
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 xmxqiyan 的回复:]
引用 13 楼 hlxk11hlxk11 的回复:

引用 12 楼 xmxqiyan 的回复:
引用楼主 hlxk11hlxk11 的回复:
▪ 云计算和云存储的关系?▪ 主流PaaS开放平台——谁是最通...▪ 解析存储虚拟化的不同应用?▪ ERP财务系统和云计算▪ 移动云计算和云计算有什么区别?有个C#的问题想请教,在线等!!
我用C#中的serialport类做一个串口通信,遇到……
[/Quote]
串口精灵可以收到59个字节,自己写的只能收到9个,要不是有这个串口精灵,我会以为是下位机只发回了9个字节,可是事实上有59个之多,而我只能收到9个。ReceivedBytesThreshold属性设置大点没有效果,改了之后的效果就是出现了重复多次出现相同的9个字节!
hlxk11hlxk11 2011-12-11
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 aini1091 的回复:]
serialPort.ReceivedBytesThreshold可能跟这个属性有关,我以前也遇到过你这种问题,我是7位的,你要是50位的话把这个值改到50应该就行了,它就会自动触发DataReceived事件
[/Quote]
这个我试过了,改到50,就是说缓冲区中有50个字节才出发DataReceived事件,改了之后的效果就是出现了重复多次出现相同的9个字节!
hlxk11hlxk11 2011-12-08
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 xmxqiyan 的回复:]
引用楼主 hlxk11hlxk11 的回复:
▪ 云计算和云存储的关系?▪ 主流PaaS开放平台——谁是最通...▪ 解析存储虚拟化的不同应用?▪ ERP财务系统和云计算▪ 移动云计算和云计算有什么区别?有个C#的问题想请教,在线等!!
我用C#中的serialport类做一个串口通信,遇到个问题,我查看了资料“通过调用一次serialport类中的Read()方法并不能确保所读取的数据就是完……
[/Quote]
关键是count = serialPort.BytesToRead; // 读取缓冲区数据长度
这个值还是9,
您的这个方法可以确定每次都将缓存区的数据都读到!还是没有办法解决无法接受50个字节的问题
xmxqiyan 2011-12-08
  • 打赏
  • 举报
回复
[Quote=引用楼主 hlxk11hlxk11 的回复:]
▪ 云计算和云存储的关系?▪ 主流PaaS开放平台——谁是最通...▪ 解析存储虚拟化的不同应用?▪ ERP财务系统和云计算▪ 移动云计算和云计算有什么区别?有个C#的问题想请教,在线等!!
我用C#中的serialport类做一个串口通信,遇到个问题,我查看了资料“通过调用一次serialport类中的Read()方法并不能确保所读取的数据就是完整一桢”,我现在就遇到这个问题,我用Read()……
[/Quote]
串口是一位一位地传输的,当你正在读的时候可能数据还没有完全传到接收缓冲区,所以你只能读到部位数据。因此需要足够长的延时来等待数据全部传输完成。你上面延时4秒再读的话可以把时间调长一点,这样不好估算时间,而且传输不同数量的字节延时长度如果长了是浪费,如果短了又无法接收完成,所以不建议直接用很长的延时。你上面发送命令后应该是等待一定时间,设备会回传数据给你,而设备响应的时间应该是可以估算的,然后再读取数据。帮你改了一下程序。


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());
mjp1234airen4385 2011-12-08
  • 打赏
  • 举报
回复
8楼+1
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
  • 打赏
  • 举报
回复
serialPort.ReceivedBytesThreshold可能跟这个属性有关,我以前也遇到过你这种问题,我是7位的,你要是50位的话把这个值改到50应该就行了,它就会自动触发DataReceived事件
qldsrx 2011-12-08
  • 打赏
  • 举报
回复
初始化(自行在构造函数中注册serialPort_DataReceived事件):

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);
}


使用:
  Byte[] BSendTemp = { 0x00, 0xff, 0xff, 0xcc, 0x01, 0x01, 0x02, 0x40, 0x00, 0x44 }; //建立临时字节数组对象
ms.Position = 0; --将内存流重置
serialPort.Write(BSendTemp, 0, 10);//发送命令


查看(添加一个按钮,点击查看,防止线程阻塞):
MessageBox.Show(ms.Position.ToString());--内存流当前位置就是接收到的字节数
xmxqiyan 2011-12-08
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 hlxk11hlxk11 的回复:]

引用 12 楼 xmxqiyan 的回复:
引用楼主 hlxk11hlxk11 的回复:
▪ 云计算和云存储的关系?▪ 主流PaaS开放平台——谁是最通...▪ 解析存储虚拟化的不同应用?▪ ERP财务系统和云计算▪ 移动云计算和云计算有什么区别?有个C#的问题想请教,在线等!!
我用C#中的serialport类做一个串口通信,遇到个问题,我查看了资料“通过调用一次serialport类……
[/Quote]
你看一下是不是你的串口控件把接收缓冲区大小设置成9字节了,如果不是可以先用串口调试助手看一下能接收到多少数据
  • 打赏
  • 举报
回复
晕不是有个DataReceived事件嘛?
在这个事件中使用SerialPort.ReadExisting 方法。
hlxk11hlxk11 2011-12-07
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 aoe1234567890 的回复:]
serialPort.Write(BSendTemp, 0, 10);//发送命令
Thread.Sleep(4000);
你既要发送数据,又要主线程休眠4秒,可能是你的数据还没有发送完,主线程就休眠了,造成后来从缓存区读出来的数据不全.其实你可以搞个定时器,设定时间为4000,然后在定时器触发时间中读串口的缓存.注意把电脑的DB9针的RS232口的2和3脚用短路块短起来.
[/Quote]
如果不延时的话,就读不到数据了。因为发送命令,下位机需要进行数据处理,才能传回数据
hlxk11hlxk11 2011-12-07
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 wuyazhe 的回复:]
接下来你如果再读,能读回更多?
[/Quote]
再读的话,还是只读到前9个字节
hlxk11hlxk11 2011-12-07
  • 打赏
  • 举报
回复
不延时的话根本就得不到数据,所以才加了4s的延时,好纠结
兔子-顾问 2011-12-07
  • 打赏
  • 举报
回复
哦。延迟4秒,因为串口是流设备,数据没发送完成或是你设备没发送完成,延迟是一种比较简单的方式,至于延迟多少。这个你试试,不一定要4秒。如果设备就是很慢,那延迟4秒也必须的。
hlxk11hlxk11 2011-12-07
  • 打赏
  • 举报
回复
[Quote=引用楼主 hlxk11hlxk11 的回复:]
▪ 并行计算与云计算的关系?▪ 什么是AppUp云服务?▪ 私有云的优势是什么?▪ 大型企业的CIO们是如何看待云计...▪ 云计算基础架构是什么?
有个C#的问题想请教,在线等!!
我用C#中的serialport类做一个串口通信,遇到个问题,我查看了资料“通过调用一次serialport类中的Read()方法并不能确保所读取的数据就是完整一桢”,我现在就遇到这个问题,我用Read()方法只……
[/Quote]
不用 Thread.Sleep(4000)的话就读不到数据,定时器我没用过,我查下资料
兔子-顾问 2011-12-07
  • 打赏
  • 举报
回复
接下来你如果再读,能读回更多?
加载更多回复(1)

110,534

社区成员

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

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

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