PC机与单片机串口通信的问题,帮忙看看这段代码,问题在哪
通信协议是0x55功能代码数据长度电压低位电压高位电流低位电流高位频率低位频率高位(注意数据之间没有空格)我想得到电压电流频率的值存入文件代码是这样的:/********...
通信协议是
0x55 功能代码 数据长度 电压低位 电压高位 电流低位 电流高位 频率低位 频率高位(注意数据之间没有空格)
我想得到电压电流频率的值存入文件
代码是这样的:
/***********初始化串口************/
m_mscomm.SetCommPort(1); //选择com1口
m_mscomm.SetInBufferSize(1024); //即默认设置 可以通过函数GetInBufferSize()获取
m_mscomm.SetOutBufferSize(512); //即默认设置 可以通过函数GetOutBufferSize()获取
if(!m_mscomm.GetPortOpen()) //打开串口
m_mscomm.SetPortOpen(true); //int i=m_mscomm.GetPortOpen();
m_mscomm.SetInputMode(1); //设置输入方式为二进制方式
m_mscomm.SetSettings("9600,n,8,1"); //设置波特率9600,无奇偶校验,8bit数据比特,1bit停止比特
m_mscomm.SetRThreshold(1); //设置每接受一个字符就产生一个事件
m_mscomm.SetInputLen(0); //从接受缓冲区读取的字节数,0表示全部读取
m_mscomm.GetInput();
void CNewDlg::OnOnCommMscomm1()
{
// TODO: Add your control notification handler code here
UpdateData(true);
VARIANT variant;
COleSafeArray safearray;
long i=0;
int len;
BYTE rxdata[100];
int buf[100];
CString tmp,recvdata;
int n=0,x=0;//测试用
switch (m_mscomm.GetCommEvent())//有事件触发
{
case 2: //表示接收缓冲区内有字符
{
variant=m_mscomm.GetInput(); //读取缓冲区的内容
safearray=variant;
len=safearray.GetOneDimSize();
for(i=0;i<len;i++)
{
safearray.GetElement(&i,&rxdata[i]);
tmp.Format("%c",rxdata[i]);
buf[i]=rxdata[i];
}
break;
}
default:
break;
}
/*******************写文件操作*******************/
f=fopen("C:\\data.txt","a+");//打开文件,可读可写打开,如果文件不存在则创建,每次写文件时将内容添加到文件末尾
if(f==NULL) {MessageBox("打开文件失败!"); return;}//如果文件没有打开就退出报错
for(int jj=0;jj<100;jj++)
int a=rxdata[jj];
int j=0;
for(j=0;j<100;j++)//搜索帧头
{if((buf[j]==0x55)&&(buf[j+1]==0x01))
break;
}
if(j<91)//分离数据
{//此时: buf[j] == 0x55 buf[j+1]功能码 buf[j+2]长度
WORD data_v=buf[j+4];
data_v=(data_v<<8)+buf[j+3];
WORD data_i=buf[j+6];
data_i=(data_i<<8)+buf[j+5];
WORD data_f=buf[j+8];
data_f=(data_f<<8)+buf[j+7];
fprintf(f,"%5d,%5d,%5d\n",data_i,data_v,data_f);
}
fclose(f);//关闭文件。
}
我调试时发现数据并没有写入文件,甚至没有存到buf中。
不好意思,我以前从没接触过串口,这段程序是从别的程序基础上改的,其实我也不咋懂,希望那位高手帮忙发现问题并把这段程序改改,如果运行通过我一定给加分
还有一个奇怪的现象是,我用另一台计算机上的调试软件按照上述协议格式通过串口发来数据接受是正确的,一切正常,就是单片机通信时才发现问题的,不明白
其中
for(int jj=0;jj<100;jj++)
int a=rxdata[jj];
是我调试时用的,可以注释掉
我用调试助手接收单片机发来的数据可以正确接收,说明单片机的发送程序肯定没问题
确定已经产生串口消息,而且rxdata中的数据是对的 展开
0x55 功能代码 数据长度 电压低位 电压高位 电流低位 电流高位 频率低位 频率高位(注意数据之间没有空格)
我想得到电压电流频率的值存入文件
代码是这样的:
/***********初始化串口************/
m_mscomm.SetCommPort(1); //选择com1口
m_mscomm.SetInBufferSize(1024); //即默认设置 可以通过函数GetInBufferSize()获取
m_mscomm.SetOutBufferSize(512); //即默认设置 可以通过函数GetOutBufferSize()获取
if(!m_mscomm.GetPortOpen()) //打开串口
m_mscomm.SetPortOpen(true); //int i=m_mscomm.GetPortOpen();
m_mscomm.SetInputMode(1); //设置输入方式为二进制方式
m_mscomm.SetSettings("9600,n,8,1"); //设置波特率9600,无奇偶校验,8bit数据比特,1bit停止比特
m_mscomm.SetRThreshold(1); //设置每接受一个字符就产生一个事件
m_mscomm.SetInputLen(0); //从接受缓冲区读取的字节数,0表示全部读取
m_mscomm.GetInput();
void CNewDlg::OnOnCommMscomm1()
{
// TODO: Add your control notification handler code here
UpdateData(true);
VARIANT variant;
COleSafeArray safearray;
long i=0;
int len;
BYTE rxdata[100];
int buf[100];
CString tmp,recvdata;
int n=0,x=0;//测试用
switch (m_mscomm.GetCommEvent())//有事件触发
{
case 2: //表示接收缓冲区内有字符
{
variant=m_mscomm.GetInput(); //读取缓冲区的内容
safearray=variant;
len=safearray.GetOneDimSize();
for(i=0;i<len;i++)
{
safearray.GetElement(&i,&rxdata[i]);
tmp.Format("%c",rxdata[i]);
buf[i]=rxdata[i];
}
break;
}
default:
break;
}
/*******************写文件操作*******************/
f=fopen("C:\\data.txt","a+");//打开文件,可读可写打开,如果文件不存在则创建,每次写文件时将内容添加到文件末尾
if(f==NULL) {MessageBox("打开文件失败!"); return;}//如果文件没有打开就退出报错
for(int jj=0;jj<100;jj++)
int a=rxdata[jj];
int j=0;
for(j=0;j<100;j++)//搜索帧头
{if((buf[j]==0x55)&&(buf[j+1]==0x01))
break;
}
if(j<91)//分离数据
{//此时: buf[j] == 0x55 buf[j+1]功能码 buf[j+2]长度
WORD data_v=buf[j+4];
data_v=(data_v<<8)+buf[j+3];
WORD data_i=buf[j+6];
data_i=(data_i<<8)+buf[j+5];
WORD data_f=buf[j+8];
data_f=(data_f<<8)+buf[j+7];
fprintf(f,"%5d,%5d,%5d\n",data_i,data_v,data_f);
}
fclose(f);//关闭文件。
}
我调试时发现数据并没有写入文件,甚至没有存到buf中。
不好意思,我以前从没接触过串口,这段程序是从别的程序基础上改的,其实我也不咋懂,希望那位高手帮忙发现问题并把这段程序改改,如果运行通过我一定给加分
还有一个奇怪的现象是,我用另一台计算机上的调试软件按照上述协议格式通过串口发来数据接受是正确的,一切正常,就是单片机通信时才发现问题的,不明白
其中
for(int jj=0;jj<100;jj++)
int a=rxdata[jj];
是我调试时用的,可以注释掉
我用调试助手接收单片机发来的数据可以正确接收,说明单片机的发送程序肯定没问题
确定已经产生串口消息,而且rxdata中的数据是对的 展开
2个回答
展开全部
有可能是这样的:有时候串口通讯传输的数据不是很稳定,比如发完0x55后过了一点时间才发送后面的数据,也有可能一次发了若干没发完,隔一点时间才发第2段,你的通信协议没有效验位,也没有奇偶效验,很容易出这种问题,而m_mscomm.SetRThreshold(1);的意思是"每接受一个字符就产生一个事件",从而每回一旦有错位,发了一个或多个错误数据,后面的数据你就都接不到了.
你试一试把1改为你的实际数据长度或更大一点,这样只有接到一定长度的数据后才会读数据,可能会好的.
你试一试把1改为你的实际数据长度或更大一点,这样只有接到一定长度的数据后才会读数据,可能会好的.
展开全部
那就简单了啊,你就一步步往下调试就可以了啊
因为我没有你的工作环境,无法帮助你调试
还有一个奇怪的现象是,我用另一台计算机上的调试软件按照上述协议格式通过串口发来数据接受是正确的,一切正常,就是单片机通信时才发现问题的,
按你的说法,那么你的程序也没有问题了啊!建议你一步步的调试看看。首先在void CNewDlg::OnOnCommMscomm1() 设置断点,看看是否产生了串口消息
你是说用另一台计算机来发送数据的话,你的程序是可以接收到的?
如果是这样的话,建议你在和单片机通讯的时候先用串口助手来接收一下单片机发过来的数据,如果不能接收到的话,那么就是单片机程序的问题了。
因为我没有你的工作环境,无法帮助你调试
还有一个奇怪的现象是,我用另一台计算机上的调试软件按照上述协议格式通过串口发来数据接受是正确的,一切正常,就是单片机通信时才发现问题的,
按你的说法,那么你的程序也没有问题了啊!建议你一步步的调试看看。首先在void CNewDlg::OnOnCommMscomm1() 设置断点,看看是否产生了串口消息
你是说用另一台计算机来发送数据的话,你的程序是可以接收到的?
如果是这样的话,建议你在和单片机通讯的时候先用串口助手来接收一下单片机发过来的数据,如果不能接收到的话,那么就是单片机程序的问题了。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询