首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ Builder >

pcomm串口通信乱码有关问题

2012-04-14 
pcomm串口通信乱码问题void __fastcall TForm1::OpenBtnClick(TObject *Sender){sio_open(portindex)sio_

pcomm串口通信乱码问题
void __fastcall TForm1::OpenBtnClick(TObject *Sender)
{
sio_open(portindex); 
sio_ioctl(portindex,B115200,P_NONE|BIT_8|STOP_1);  
sio_SetReadTimeouts(portindex,500,100); //500ms内每隔100ms读一次输入缓冲区,若有数据就跳出循环
void __stdcall cntirq(int);  
sio_cnt_irq(portindex,cntirq,1); 
}

void _stdcall cntirq(int port)
//中断处理函数;
{
 char *ibuf=new char[20480];
 rlen=sio_read(portindex,ibuf,100);
 if(rlen>0)
 Form1->ReceiveMemo->Text=Form1->ReceiveMemo->Text+AnsiString(ibuf);
}
收到的数据乱码率比较高,如何解决呢?
此外,波特率115200,数据接收周期50ms,sio_SetReadTimeouts(portindex,500,100)中500和100的参数设置对数据接收的影响有哪些?是造成乱码率高的原因吗?请高手解答

[解决办法]
void _stdcall cntirq(int port)
//中断处理函数;
{
 char *ibuf=new char[20480];
 rlen=sio_read(portindex,ibuf,100);
 if(rlen>0)
 Form1->ReceiveMemo->Text=Form1->ReceiveMemo->Text+AnsiString(ibuf);
}
你这里面ibuf有可能本来就不是字符,你转换后肯定是乱码了,
要不你16进制显示一下看看

C/C++ code
void _stdcall cntirq(int port)//中断处理函数;{ char *ibuf=new char[20480];String ss; rlen=sio_read(portindex,ibuf,100); if(rlen>0){ss= Form1->ReceiveMemo->Text;for(int i=0;i<rlen;i++){ss+=" 0x"+IntToHex(ibuf[i],2); }Form1->ReceiveMemo->Text=ss;}// Form1->ReceiveMemo->Text=Form1->ReceiveMemo->Text+AnsiString(ibuf);}
[解决办法]
我觉得是收到的数据是由于字符串相加引起的乱码。
如果一个字符串分两次收到的,需要把这两次收到的内容相加,
如果第一次收到的数据的最后一个字节是半个汉字,那么这半个汉字就已经乱码了,因为AnsiString总是把当前的内容作为一个整体,下一次收到的第一个字节是半个汉字,这次收到的数据也是在AnsiString里面,AnsiString也会把这包数据看成一个整体,那从这半个汉字开始之后的连续的汉字都是乱码,再相加的时候,AnsiString不会把前面的半个汉字后后面的半个汉字合成整个汉字,因为AnisString总是认为存在AnsiString里面的内容是整体的,完整的。

如果要进行字符串相加,唯一办法是用字符数组,就是char数组,收到的数据放在char数组里面,记住字节数,下次收到的数据继续放在这个数组里面,每个字节的位置都正确,这样才能保持不乱码。

热点排行