两台计算机串口通信,收发英文字符正常,中文字符乱码?

yangtou1 2012-02-28 09:14:46
代码如下:
void __fastcall TForm1::bStateClick(TObject *Sender)
{
char *ComNo;
DCB dcb;
AnsiString Temp;
Temp = "COM" + IntToStr(SecCom->ItemIndex+1);
ComNo = Temp.c_str();//获取端口字符串的首地址
hComm = CreateFile(ComNo, GENERIC_READ|GENERIC_WRITE, 0, NULL,
OPEN_EXISTING, 0,0);
if(hComm == INVALID_HANDLE_VALUE)
{
MessageBox(NULL, "端口打开失败", "ComError", MB_OK);
return;
}
GetCommState(hComm, &dcb);
dcb.BaudRate = CBR_9600;//波特率为9600
dcb.ByteSize = 8;//数据位数
dcb.Parity = NOPARITY;//奇偶校验位
dcb.StopBits = ONESTOPBIT;//停止位
if(!GetCommState(hComm,&dcb)) //如果调用串口状态失败
{
MessageBox(NULL, "获取串口状态失败", "StateError", MB_OK);
CloseHandle(hComm);
return;
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::bQuitClick(TObject *Sender)
{
if(hComm != INVALID_HANDLE_VALUE) //如果端口未关闭
{
CloseHandle(hComm);
}
exit(EXIT_SUCCESS);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::bSendClick(TObject *Sender)
{
//发送数据
char *Data;//定义发送数据指针
unsigned long ln;//发送数据的长度
unsigned long AllOfln; //定义发送数据总字节数
AnsiString SendTemp;//定义发送字符串变量
if(hComm == 0) return;
SendTemp = SendData->Text;//发送字符串赋值
Data = SendTemp.c_str();//获取发送数据指针
ln = SendTemp.Length();//获取发送数据的长度
WriteFile(hComm, Data, ln, &AllOfln, NULL); //发送数据
}
//---------------------------------------------------------------------------
void __fastcall TForm1::bRceiveClick(TObject *Sender)
{
//接收数据
char inbuff[1024];//定义接收数据缓冲区的地址
DWORD dwError, lrc;//定义接收错误代码变量的指针
COMSTAT cs;//定义通信状态缓冲区指针
ClearCommError(hComm, &dwError, &cs); //读取串行端口现在的状态
if(cs.cbInQue > sizeof(inbuff))
{
PurgeComm(hComm, PURGE_RXCLEAR);
return;
}
ReadFile(hComm, inbuff, cs.cbInQue, &lrc, NULL);//接收数据
inbuff[cs.cbInQue] = '\0';
ReciveData ->Text = inbuff; //将接收数据显示在Memo1上
}
//---------------------------------------------------------------------------
...全文
314 4 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
cptang 2012-03-07
  • 打赏
  • 举报
回复
参考台湾人写的一本书,好像是c++builder和串口通信
里面实现了一个控件
你可以参考参考
Lewolf 2012-02-29
  • 打赏
  • 举报
回复
GetCommState(hComm, &dcb);
dcb.BaudRate = CBR_9600;//波特率为9600
dcb.ByteSize = 8;//数据位数
dcb.Parity = NOPARITY;//奇偶校验位
dcb.StopBits = ONESTOPBIT;//停止位
if(!GetCommState(hComm,&dcb)) //如果调用串口状态失败
{
MessageBox(NULL, "获取串口状态失败", "StateError", MB_OK);
CloseHandle(hComm);
return;
}



if 后面的应该是SetCommState吧,如果汉字出错,应该是ByteSize 的问题,看看你的硬件端口设置,相对保守的做法是将汉字转换为7bit编码的数据发送。
我不懂电脑 2012-02-29
  • 打赏
  • 举报
回复
用MSCOMM二进制方式通信
guojun_hope 2012-02-29
  • 打赏
  • 举报
回复
为什么不用控件呢?推荐使用PCOMM,或MSCOMM

13,873

社区成员

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

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