串口通信单片机接收受到的数据总是比发送的多108(即80h)?比如发送字符a,到单片机中变成e1.怎么回事
MFC程序:用的是Vs2012中的MicrosoftcommunicationControl,6.0版本控件。m_Comm是该控件的一个控制变量。打开端口的代码://如果...
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 展开
打开端口的代码:
//如果串口是打开的,则先关闭串口
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 展开
3个回答
2015-04-25
展开全部
先不要跟单片机通信。先去下载个虚拟串口调通你的软件,二进制、文本放送接收先理清楚
更多追问追答
追答
请问需要什么硬件?
没有开发板
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2015-04-22
展开全部
晶振不对
更多追问追答
追问
是波特率不匹配吗?
追答
用的是12M的晶振做的9600的波特率吧!
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询