MSCOMM的ONCOMM事件,如何判断当前的数据已经接收完成???

zbc 2009-04-20 07:12:27
大家来救一下急,我用mscomm控件,写的接收代码如下:
void __fastcall TForm1::MSComm1Comm(TObject *Sender)
{
AnsiString str; //声明一个AnsiString类型的变量
OleVariant s; //声明一个用于接收数据的OleVariant变量。
if(MSComm1->CommEvent==comEvReceive)// 接收缓冲区中是否收到Rthreshold个字符。
{
if(MSComm1->InBufferCount)// 是否有字符驻留在接收缓冲区等待被取出
{
s=MSComm1->Input;//接收数据
str=s.AsType(varString); //把接收到的OleVariant变量转换成AnsiString类型
Edit1->Text = str;

//下面的程序用于把数据保存到数据库中,只存交班时的数据
}
}
}
每次保存到数据库中后,都不能正常的保存完整数据。该如何做,才能保证接收完成后,才去保存数据到数据库中啊?
...全文
219 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
yhec 2009-05-12
  • 打赏
  • 举报
回复
用ONCOMM事件麻烦很多,
因为:一个通讯串可能被分成N串,
在这个事件中你要把它拼成一个整体串,
多余的串还要留给下一次任务;
如果处理串的过程还要字符来了,
重入引起新的麻烦。
我不用ONCOMM事件处理接收,用同步方式:
我按对话协议发送我的串后,立即在设定时间内,
按收我要的N节字节,如果不能在规定的时间内收到,
我认为“超时”

yhec 2009-05-12
  • 打赏
  • 举报
回复
串行通讯的字符流是没有边界的,不能简单判断字符有没有结束,
靠你程序根据对话协议自行判断,如:这次发送,将收到10个字符的
应答,10个字符后就是你的边界
renhaobin2000 2009-05-11
  • 打赏
  • 举报
回复
首先你要确认你收的数据是一个完整的数据,有时候串口发送数据比如有500个byte,第一次有可能你收了200byte。下一次查询可能收了300byte。要把两次查询的数据组合起来合并成一个完整的帧。
constantine 2009-04-20
  • 打赏
  • 举报
回复
Edit1->Text = str;
如果这里显示对了,那么查查入库代码。
关键是你看到的到底怎么错法并不清除。

13,825

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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