急关于串口通信的问题!请各位大虾帮帮我把!

alexchen1980 2006-04-27 11:27:44
假设当我用向串口发送数据如下时:ff ff f0 00 00 00 00 e0 ae
编写的串口通信接受程序如下:
MSComm1->RThreshold=9; //送9个字符
MSComm1->InputLen=0; //缓冲区全收
MSComm1->InputMode=0; //字符串接受
MSComm1->Handshaking=1; //握手

AnsiString str;
OleVariant s;
if (MSComm1->CommEvent) //收到9个字符
{
if(MSComm1->InBufferCount)
{
s=MSComm1->Input;
str=s.AsType(varString);
}
}
这时,MSComm1->InBufferCount=3,因为 00 被识别为了字符串的结尾符,这样就照成了接收不正确。我考虑可以设 MSComm1->InputMode=1,就是二进制接受应该可以避免这个问题,但不知如何编写这段程序,急请各位大虾指教。
...全文
307 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
yz20050510 2006-05-04
  • 打赏
  • 举报
回复
帮你顶
alexchen1980 2006-04-30
  • 打赏
  • 举报
回复
谢谢你的 Persistent8813,
Persistent8813 2006-04-28
  • 打赏
  • 举报
回复

void __fastcall TF_Main::JudgeTimerTimer(TObject *Sender)
{ /*****串口监控JudgeTimer定时器响应事件*****/
OleVariant RcvD;
NowNum = Com1->InBufferCount; //读取输入缓冲区字节数
if(NowNum>0){ //输入缓冲区有字节输入时
if(NowNum == PreNum){ //间隔100读入的字节数是否相等判断,如果相等表示一批数据已经发送完毕
Rcv = Com1->Input; //从串口缓冲区读入数据
// RcvD = Com1->Input;
PreNum = 0; //变量赋初值
NowNum = 0;
// RcvData[0]=RcvD.GetElement(0);
ProcessData(Rcv); //数据处理
}
else
PreNum = NowNum; //后一次读入的字节数赋前一次读入的字节数
}
}
//---------------------------------------------------------------------------

void __fastcall TF_Main::ProcessData(AnsiString rcv)
{ /*****用户自定义接收数据处理函数*****/
char judge[100];
strcpy(judge,rcv.c_str()); //Copy接收的数据到judge字符数组
if(judge[2]!=0x03){
strcpy(RcvData,rcv.c_str()); //Copy接收的数据到RcvData字符数组
SaveData(); //用户自定义存储数据到数据库函数
}
else{
char buff[4];
buff[0]=0x02;buff[1]=0x79;buff[2]=0x03;buff[3]=0x31;
SendData(StrPas(buff)); //用户自定义发送应答数据函数
}
}
//---------------------------------------------------------------------------

void __fastcall TF_Main::SendData(AnsiString send)
{ /*****用户自定义发送应答数据函数*****/
/* SenData[0]=0x02;
SenData[1]=0xa9;
SenData[2]=0x03;
SenData[3]='\0';
//****************************************
//一维的Byte型的动态数组边界为(0到Count) 由于char型的Count最大值为255,
//故为0到254再去掉末尾的校验和和加上头部的帧类型号后为0-251(实际数据的最大为252个
//重置它的大小 varByte为TxBuff每一个元素的类型。
OleVariant TxBuff; //声明一个OleVariant 变量
AnsiString tx;
TxBuff=VarArrayCreate(OPENARRAY(int,(0,3)),varByte);//
tx = StrPas(SenData);
int j = tx.Length();
for(int i=0;i<3;i++)
TxBuff.PutElement(SenData[i],i); //填充元素
if(!Com1->PortOpen) //保证端口打开
Com1->PortOpen=true;
Com1->Output = TxBuff; //发送数据
*/
if(!Com1->PortOpen) //保证端口打开
Com1->PortOpen=true;
Com1->Output = send; //发送数据
}
//---------------------------------------------------------------------------

1,317

社区成员

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

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