串口通信单片机接收受到的数据总是比发送的多108(即80h)?比如发送字符a,到单片机中变成e1.怎么回事

MFC程序:用的是Vs2012中的Microsoft communication Control ,6.0版本控件。 m_Comm是该控件的一个控制变量。
打开端口的代码:
//如果串口是打开的,则先关闭串口
if (m_Comm.get_PortOpen())
m_Comm.put_PortOpen(FALSE);
int iPort=3;
m_Comm.put__CommPort(iPort);//选择com1
m_Comm.put_InBufferSize(2048);//接受缓冲区的大小
m_Comm.put_OutBufferSize(2048);//发送缓冲区的大小
m_Comm.put_InputLen(0);//设置当前接收区数据长度为0,即全部接受
m_Comm.put_InputMode(1);//表示以二进制形式接收
m_Comm.put_RThreshold(1);//接收缓冲区有一个及一个以上字符时,将引发接收数据的OnCommMscomm1事件。
m_Comm.put_Settings(_T("9600,n,8,1"));//波特率9600无校验位,8个数据位,1个停止位
//如果串口没有打开则打开。
if (!m_Comm.get_PortOpen())
{
m_Comm.put_PortOpen(TRUE);
MessageBox(L"串口打开成功");
}
else
{
m_Comm.put_OutBufferCount(0);
MessageBox(L"串口打开失败");
}
发送数据的代码:(IDC_EDIT_Send,m_EditSend分别是输入编辑框以及对应值类型String变量)
UpdateData(TRUE);//读取编辑框的数值
COleVariant var=m_EditSend;
m_Comm.put_Output(var);
m_EditSend.Empty();//发送完后清空编辑框
//UpdateData(FALSE);//更新编辑框内容
SetDlgItemText(IDC_EDIT_Send,m_EditSend);
单片机运行的代码(这是厂家附带的,应该不会有问题):

/*主程序*/
void main (void)
{

SCON = 0x50; /* SCON: 模式 1, 8-bit UART, 使能接收 */
TMOD |= 0x20; /* TMOD: timer 1, mode 2, 8-bit reload */
TH1 = 0xFD; /* TH1: reload value for 9600 baud @ 11.0592MHz */
TR1 = 1; /* TR1: timer 1 run */
EA = 1; /*打开总中断*/
ES = 1; /*打开串口中断*/

while (1) /*主循环不做任何动作*/
{
}
}

void UART_SER (void) interrupt 4 //串行中断服务程序
{
unsigned char Temp; //定义临时变量

if(RI) //判断是接收中断产生
{
RI=0; //标志位清零
Temp=SBUF; //读入缓冲区的值
P1=Temp; //把值输出到P1口,用于观察
SBUF=Temp; //把接收到的值再发回电脑端
}
if(TI) //如果是发送标志位,清零
TI=0;
}
说错了,应该是接受的实际比发送的多128

以后记住,串口通信能发能收,就是通信双方波特率不统一。你现在看看吧。追问

单片机发回来的是正确的,而电脑上发送到单片机上的是错误的啊(通过开发板上的led灯可以看出单片机收发的值)

追答

这真就莫名其妙了,说不通啊。能力所限,看来是帮不了你了。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2015-04-25
先不要跟单片机通信。先去下载个虚拟串口调通你的软件,二进制、文本放送接收先理清楚追答

请问需要什么硬件?

没有开发板

回复 tangluyangtang :不用硬件啊,你网上搜一下虚拟串口软件

正解。做上位机实验的时候,先利用串口软件调试好单片机部分,然后利用虚拟串口发送数据到上位机,看看发送的数据是否和接收的数据对应,这两个都成功了,再去让单片机和上位机通信,这样的步骤是正常的逻辑。

看起来繁琐,但是出了问题,就可以确定问题所在的地方在单片机还是上位机

第2个回答  2015-04-22
晶振不对追问

是波特率不匹配吗?

追答

用的是12M的晶振做的9600的波特率吧!

换成2400的波特率或者换11.0592晶振

追问

晶振是11.0592MHz

追答

单片机的波特率和电脑设置的波特率一致吗?

或者你发的是字符,字符3等于十六进制的0x33

相似回答