急,求一个MSComm控件串口通讯的解决方案

fall1979 2007-12-13 06:16:53
我要通过串口接收硬件设备发送的信息,我采用的是MSComm控件,代码如下
变量 TMSComm *mscomLink;
//打开串口的代码是:
mscomLink->CommPort=1;
mscomLink->Settings="1200,n,8,1";
mscomLink->PortOpen=true;
其它参数都是控件默认的
InBufferSize为1024,RThreshold为0,SThreshold为0,InputMode为0;
//获取报警主机的报警信号
WideString wstrInf;
AnsiString strInf;
TMemo *memoInf;
if (mscomLink->InBufferCount>0)
{
wstrInf=WideString(mscomLink->Input);
strInf=AnsiString(wstrInf);
memoInf->Lines->Add(strInf);
}
这个程序针对以前的硬件设备都没问题,但是现在的项目硬件设备换了个型号,结果通过这段代码获取的信息是乱码,但是windows的超级终端上获取的信息是正常的字符串,我问了一下,有人告诉我可能是Unicode字符串的转换问题,不知道哪位高手能帮个忙,给个解决方案。

我曾经尝试在MSComm的OnComm事件中写如下代码,结果获取的还是乱码:
char szBuf[4096]={0};
int i,j;
OleVariant RxBuff;

if (mscomLink->CommEvent==comEvReceive)
if (mscomLink->InBufferCount>0)
{
RxBuff=mscomLink->Input;
j=RxBuff.ArrayHighBound(1);
for (i=0;i<=j;i++)
szBuf[i]=RxBuff.GetElement(i);
szBuf[i]=NULL;

memoInf->Lines->Add(AnsiString(szBuf));
}

时间比较急,请高手指点一下,谢谢!
...全文
152 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
fall1979 2007-12-17
  • 打赏
  • 举报
回复
终于搞明白怎么回事了,是串口参数设置的问题。以前那个型号的硬件串口参数设置是8位数据位,无校验位的。这次换了型号后,我用超级终端接收的时候还是设置的8位数据位,无校验位,而且数据接收正常,我以为是我程序的问题,没想到最后才发现超级终端自动调整了参数设置,其实正确参数是7位数据位,偶校验。最后程序调整了一下参数接收数据就没问题了。
fall1979 2007-12-14
  • 打赏
  • 举报
回复
有没有人遇到过类似的问题的啊?
fall1979 2007-12-14
  • 打赏
  • 举报
回复
zhgwbzhd ,关键是通过超级终端获取的数据是正常的字符串,所以我觉得可能还是我处理上的问题
zhgwbzhd 2007-12-14
  • 打赏
  • 举报
回复
我觉得还是咨询一下,硬件的生产厂家吧。
有可能问题出在他的哪方面。
fall1979 2007-12-14
  • 打赏
  • 举报
回复
兄弟们帮帮忙啊 !
constantine 2007-12-14
  • 打赏
  • 举报
回复
你的协议如何定义?又传送什么内容呢?
你跟踪一下接受的buf,看看数据对不对先,如果对了,有可能是你上位解析错位或者其他错误。
如果不对,检查下位发送是否有问题。
比如:我们最近做通信,下位要发“高阻”上来(当然只是包里面的一个字段),他直接用Cstring的GetLength函数,结果获取的长度只有2,只发上来“高”。做通信协议很重要,协议定义好了,出问题,直接检查对应的位置数据基本就可以找出来。
fall1979 2007-12-14
  • 打赏
  • 举报
回复
i_love_pc ,请问有没有代码,能否发一下,原来没接触过,不知道该如何处理,谢谢
i_love_pc 2007-12-14
  • 打赏
  • 举报
回复
协议上应该会有发生和接收数据的格式,如果是因为Unicode的问题,可以将接收的数据直接保存为文件,用ultraEdit等工具打开看看,传输的数据是否正确!

Unicode字符的话,前两个字节数据应该是 FF FE...
fall1979 2007-12-13
  • 打赏
  • 举报
回复
第二种方法串口设置如下:
mscomLink-> CommPort=1;
mscomLink-> Settings="1200,n,8,1";
mscomLink->InBufferSize= 4096;
mscomLink->OutBufferSize= 2048;
mscomLink->RThreshold= 1;
mscomLink->SThreshold= 1;
mscomLink->InputMode= comInputModeBinary;
mscomLink->PortOpen=true;
mscomLink->InputLen=0;
mscomLink->InBufferCount=0;
mscomLink->OutBufferCount=0;

1,317

社区成员

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

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