【探讨】如何从串口读值为0x00的数?

wubuy2 2004-01-10 05:08:49
因为值0x00是结束符。当串口一串数据中包含0x00,那么它后面的数据就无法读了。
有人知道如何解决吗?

我用的是微软的MSCOMM控件

非常感谢!
...全文
380 23 打赏 收藏 转发到动态 举报
写回复
用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)

1,317

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder 网络及通讯开发
社区管理员
  • 网络及通讯开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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