社区
网络及通讯开发
帖子详情
【探讨】如何从串口读值为0x00的数?
wubuy2
2004-01-10 05:08:49
因为值0x00是结束符。当串口一串数据中包含0x00,那么它后面的数据就无法读了。
有人知道如何解决吗?
我用的是微软的MSCOMM控件
非常感谢!
...全文
380
23
打赏
收藏
【探讨】如何从串口读值为0x00的数?
因为值0x00是结束符。当串口一串数据中包含0x00,那么它后面的数据就无法读了。 有人知道如何解决吗? 我用的是微软的MSCOMM控件 非常感谢!
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
23 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
phder
2004-07-02
打赏
举报
回复
使用二进制方式
rookieme
2004-01-18
打赏
举报
回复
同意用MSComm1->InBufferCount
woainihaha
2004-01-18
打赏
举报
回复
同意用MSComm1->InBufferCount
其实要用MSComm也可以,每次取数据的时候根据缓冲区长度直接读取数据就可以了.
CityHost
2004-01-17
打赏
举报
回复
顶一下
fronm
2004-01-15
打赏
举报
回复
k=MSComm1->InBufferCount;
估计楼主是用strlen()来计算数据长度
该用k=MSComm1->InBufferCount;
接收就可以了
----绝对可以!我以前也有此问题,就是这样解决的。
路人丁
2004-01-15
打赏
举报
回复
看来是设计期可视化用习惯了!……
其实他的例子那么多说明那么详细很好了。
iyln
2004-01-13
打赏
举报
回复
PComm好是好,不过非要带着个DLL,怪别扭的,而且在CB中标准C++写的控件用起来不如VCL控件来得方便~
esiedull
2004-01-12
打赏
举报
回复
确实加个0X30用ANSII
yangguo_god
2004-01-12
打赏
举报
回复
我以前都是用api做的,没这个问题
chifengwatch
2004-01-12
打赏
举报
回复
希望你不要用strlen()这一类的函数
fatwave
2004-01-12
打赏
举报
回复
TO 楼上:
0xff + 0x33 = 0x132
用byte的话会自动去掉大于255(0x100)的数!
所以在接收端当收到数据小于0x33是,说补上0x100!!
路人丁
2004-01-12
打赏
举报
回复
为什么要加来加去的作转化?只要你在接收上不要把它当作作一些处理就可以了。MSCOMM我没有用过,但是也不至于那么烂吧?
推荐你用这个东西:PComm.可以到moxa.com.cn下载,强大好用
「已注销」
2004-01-11
打赏
举报
回复
二进制,按长度取,这个长度不是字符串的长度,是你发送的长度
swites
2004-01-11
打赏
举报
回复
希望你不要用strlen()这一类的函数,他会把第一个0x00后面的数截掉。
路人丁
2004-01-11
打赏
举报
回复
这种原因不是能否读的问题!
首先一定能读。
这是你对接收数据处理中出现的问题。
楼上一位兄弟说加上0x33,这种方式作单字节操作大于0xff-0x33以上的数据会造成溢出。
出错原因:C/C++语言中0x00是结束符,你的接受过程中不能把读过来的数据当作字符或者字符串处理,你可以用byte类型接受,即使用char类型接受也不要用操作字符的函数来处理就没为题了。
不论用控件还是用API这个问题都要你自己做好数据类型处理。
swites
2004-01-11
打赏
举报
回复
搂主说错了!
值0x00是char*的结束符,并不是发送的结束符。下面的源代码是我用了
几年的老程序中摘出来的:希望对你有用。
void __fastcall TMainForm::MSComm1Comm(TObject *Sender)
{
//*******************************************************************
// TODO: Add your control notification handler code here
//----------------------数据初始化-----------------------------------
tagVARIANT buffer;
unsigned int k;
//*******************************************************************
//**********************接收中断数据*********************************
k=MSComm1->InBufferCount;
unsigned char *temp=new char[k];
if(k)
{
MSComm1->InputLen=k;
buffer=MSComm1->Input;
temp=(unsigned char*)buffer.parray->pvData;
//temp-->即为接受的数组,长度为k;
}
delete []temp;
}
iyln
2004-01-11
打赏
举报
回复
可以试试ouxcomm控件
yjy1001
2004-01-11
打赏
举报
回复
k=MSComm1->InBufferCount;
嘿嘿~ 估计楼主是用strlen()来计算数据长度
该用k=MSComm1->InBufferCount;
接收就可以了
wubuy2
2004-01-10
打赏
举报
回复
我是因为项目时间紧,所以才用这控件了。
看来是不行了。:)
wubuy2
2004-01-10
打赏
举报
回复
首先感谢参与讨论的朋友!
通过研究发现,BCB中OleVariant类型自动就把串口的数据转化成ASCII值了,在转化过程中碰到0x00就认为是结束,所以,用MSCOMM控件估计是搞不定0x00这个问题了!难怪那么多人不推荐用这个控件呢。
不知道本人分析是否正确?望高手赐教!
加载更多回复(3)
stm32的modbus主机电表读
数
stm32读取电表的
数
据,有crc校验,自己写的,可以参考
串口
转存SD卡(以0x66aa为结尾标志)
串口
转存SD卡(以0x66aa为结尾标志)
模拟IIC驱动GY-530 VL53L0X激光传感器,C语言
模拟IIC驱动GY-530 VL53L0X激光传感器,C语言编写的,压缩包内有模拟IIC的.c和.h文件,和VL53L0X的.c和.h文件,移植的话只需更改IIC.h中的引脚定义即可调用函
数
Modbus
串口
通讯例程
Modbus
串口
通讯例程,基于C#开发工具!
pelco-d最新文档
pelco-d最新文档 pelco-d每个字节的介绍,以及日常经常用到的都列出来了.E文版的.
网络及通讯开发
1,317
社区成员
8,874
社区内容
发帖
与我相关
我的任务
网络及通讯开发
C++ Builder 网络及通讯开发
复制链接
扫一扫
分享
社区描述
C++ Builder 网络及通讯开发
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章