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灯可以看出单片机收发的值)
追答这真就莫名其妙了,说不通啊。能力所限,看来是帮不了你了。
请问需要什么硬件?
没有开发板
回复 tangluyangtang :不用硬件啊,你网上搜一下虚拟串口软件
正解。做上位机实验的时候,先利用串口软件调试好单片机部分,然后利用虚拟串口发送数据到上位机,看看发送的数据是否和接收的数据对应,这两个都成功了,再去让单片机和上位机通信,这样的步骤是正常的逻辑。
看起来繁琐,但是出了问题,就可以确定问题所在的地方在单片机还是上位机
是波特率不匹配吗?
追答用的是12M的晶振做的9600的波特率吧!
换成2400的波特率或者换11.0592晶振
追问晶振是11.0592MHz
追答单片机的波特率和电脑设置的波特率一致吗?
或者你发的是字符,字符3等于十六进制的0x33