Victor串口控件的使用

qq_18214415 2018-07-30 09:35:02
我采用victor控件从驱动器(下位机)接收数据,然后把数据画成波形,因为数据返回的数据很快,现在victor不能接受到下位机的数据,前面有速度不快的指令,收发是正常的,但是后面的数据速度很快,一直收不到,我最开始是在一个线程里面接收的,但是不可以,后面我改成在一个定时器里面,每隔5ms从缓冲里面读取一次,但是仍然不可以,下位机每帧数据是十个字节的数据。
...全文
669 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
这样的数据利用控件自动解析数据包的方法不适用,需要自己按照通讯协议解析数据,换哪个控件都一样
hongss 2018-08-03
  • 打赏
  • 举报
回复
以前是这么用的,供参考


int buff[200];//声明一个存储接收数据的缓冲区,全局变量

int ByteNum;//收到的字节数
int BuffPtr;//接收缓冲区的指针,请声明为全局变量,
OleVariant RxBuff;//一个用于接收的OleVariant变量。

if(MSComm1-> InBuffCount>0)RxBuff=Communica1->Input;//如果缓冲区有多于一个字节的数据
ByteNum=RxBuff.ArrayHighBound(1);//将实际读的字节数取出
for(int i=0;i<=ByteNum;i++)
{
buff[BuffPtr++]=RxBuff.GetElement(i);//将接收数据读入自己的缓冲区。
}
qq_18214415 2018-07-31
  • 打赏
  • 举报
回复
引用 7 楼 hongss 的回复:
直接按字符串读进来,再解析

请问这么写有什么错误?
void __fastcall TForm3::Timer1Timer(TObject *Sender)
{
unsigned char buf[8] ={0};
AnsiString str;
int count=MSComm1->InBufferCount; //字节数;
OleVariant rec = MSComm1->Input; //取出接收缓冲器内容;
char m = rec.GetElement(count-1);//测试发现这一句不对
for(int j=0;j<count; j = j+8)
{

for(int m =0;m<8;m++)
{
if(8*j+m>=count)
break;
buf[m] = rec.GetElement(j*8+m); //转换成字节类型
}
}
}
测试的那一句发现有错,我在循环里面加一个static变量,也发现循环的次数小于字节数count
hongss 2018-07-31
  • 打赏
  • 举报
回复
直接按字符串读进来,再解析
titan_ysl 2018-07-30
  • 打赏
  • 举报
回复
1.接收数据建议在控件的1 OnPackage 事件里写。
2.对方发来的数据即使是一次发一帧、八个字节,但在接收时,也可能会出现接收到不完整的一帧的情况,所以你在处理时,要对剩余数据不足一帧的情况进行处理。
qq_18214415 2018-07-30
  • 打赏
  • 举报
回复
求帮助谢谢大家
qq_18214415 2018-07-30
  • 打赏
  • 举报
回复
我现在改用了TComm控件,请问八字节的16进制数据接收应该怎么写呢?
qq_18214415 2018-07-30
  • 打赏
  • 举报
回复
上面一个地方打错了,每帧数据是八个字节
qq_18214415 2018-07-30
  • 打赏
  • 举报
回复
qq_18214415 2018-07-30
  • 打赏
  • 举报
回复
引用 4 楼 titan_ysl 的回复:
1.接收数据建议在控件的1 OnPackage 事件里写。
2.对方发来的数据即使是一次发一帧、八个字节,但在接收时,也可能会出现接收到不完整的一帧的情况,所以你在处理时,要对剩余数据不足一帧的情况进行处理。
OnPackage 事件有时间间隔,我数据发的很快,OnPackage 基本是进不去的

703

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder ActiveX/COM/DCOM
社区管理员
  • ActiveX/COM/DCOM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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