串口通讯有关问题(小弟我快疯了)!
求助:串口通讯问题(我快疯了)!!!
单片机和PC机通讯,上位机我VC++6.0 开发的。部分代码如下:
一次传4014个字符。前14个用来显示,后4000个存放在两个数组里。用来处理,这里只需要把前14个正确显示,我的程序显示的是乱码,有时连乱码都没有。程序还有其他的部分没有列出。
CMyCOMMDlg::OnInitDialog()
{
if(m_comm.GetPortOpen())
m_comm.SetPortOpen(FALSE);
m_comm.SetCommPort(1);//选择com1
if(!m_comm.GetPortOpen())
m_comm.SetPortOpen(TRUE);//打开串口
else
AfxMessageBox( "can not open serial port ");
m_comm.SetSettings( "115200,n,8,1 "); //波特率115200,无校验,8个数据位,1个停止位
m_comm.SetInputMode(1);//1:表示以二进制方式检取数据
m_comm.SetRThreshold(4014); //一次传4014个字符
m_comm.SetInputLen(0);//设置当前接收区数据长度为0,读取接收缓冲区的全部内容
m_comm.GetInput();//先预读缓冲区以清除残留数据,
}
void CMyCOMMDlg::OnCommMscomm1()
{
VARIANT variant_inp;
COleSafeArray safearray_inp;
LONG len,k;
BYTE rxdata[5014]; //设置BYTE数组 An 8-bit integerthat is not signed.
CString strtemp;
if(m_comm.GetCommEvent()==2) //事件值为2表示接收缓冲区内有字符
{
variant_inp=m_comm.GetInput(); //读缓冲区
safearray_inp=variant_inp; len=safearray_inp.GetOneDimSize(); //得到有效数据长度
for(k=0;k <len;k++)
safearray_inp.GetElement(&k,rxdata+k);//转换为BYTE型数组
for(k=0;k <len;k++)//将数组转换为int /Cstring型变量
{
BYTE bt=*(int*)(rxdata+k);//整形数/字符型(char)
if(k> =0&&k <14)
{
BYTE bt=*(int*)(rxdata+k);//整形数/字符型(char)
strtemp.Format( "%c ",bt);//将整形数/字符(%c)送人临时变量strtemp存放
m_get+=strtemp;//加入接收编辑框对应字符串
}
if(k> =14&&k <2014)
{
BYTE bt=*(int*)(rxdata+k);//整形数/字符型(char)
ch1[k-14]=2.4*((float)bt/256);
}
if(k> =2014&&k <4014)
{
BYTE bt=*(int*)(rxdata+k);//整形数/字符型(char)
ch2[k-2014]=2.4*((float)bt/256);
}
}
m_comm.SetPortOpen(FALSE);
}
UpdateData(FALSE);
}
------解决方案--------------------
你用的是MScomm控件吗
------解决方案--------------------
单片机和PC机通讯,上位机我VC++6.0 开发的。部分代码如下:
一次传4014个字符。前14个用来显示,后4000个存放在两个数组里。用来处理,这里只需要把前14个正确显示,我的程序显示的是乱码,有时连乱码都没有。程序还有其他的部分没有列出。
CMyCOMMDlg::OnInitDialog()
{
if(m_comm.GetPortOpen())
m_comm.SetPortOpen(FALSE);
m_comm.SetCommPort(1);//选择com1
if(!m_comm.GetPortOpen())
m_comm.SetPortOpen(TRUE);//打开串口
else
AfxMessageBox( "can not open serial port ");
m_comm.SetSettings( "115200,n,8,1 "); //波特率115200,无校验,8个数据位,1个停止位
m_comm.SetInputMode(1);//1:表示以二进制方式检取数据
m_comm.SetRThreshold(4014); //一次传4014个字符
m_comm.SetInputLen(0);//设置当前接收区数据长度为0,读取接收缓冲区的全部内容
m_comm.GetInput();//先预读缓冲区以清除残留数据,
}
void CMyCOMMDlg::OnCommMscomm1()
{
VARIANT variant_inp;
COleSafeArray safearray_inp;
LONG len,k;
BYTE rxdata[5014]; //设置BYTE数组 An 8-bit integerthat is not signed.
CString strtemp;
if(m_comm.GetCommEvent()==2) //事件值为2表示接收缓冲区内有字符
{
variant_inp=m_comm.GetInput(); //读缓冲区
safearray_inp=variant_inp; len=safearray_inp.GetOneDimSize(); //得到有效数据长度
for(k=0;k <len;k++)
safearray_inp.GetElement(&k,rxdata+k);//转换为BYTE型数组
for(k=0;k <len;k++)//将数组转换为int /Cstring型变量
{
BYTE bt=*(int*)(rxdata+k);//整形数/字符型(char)
if(k> =0&&k <14)
{
BYTE bt=*(int*)(rxdata+k);//整形数/字符型(char)
strtemp.Format( "%c ",bt);//将整形数/字符(%c)送人临时变量strtemp存放
m_get+=strtemp;//加入接收编辑框对应字符串
}
if(k> =14&&k <2014)
{
BYTE bt=*(int*)(rxdata+k);//整形数/字符型(char)
ch1[k-14]=2.4*((float)bt/256);
}
if(k> =2014&&k <4014)
{
BYTE bt=*(int*)(rxdata+k);//整形数/字符型(char)
ch2[k-2014]=2.4*((float)bt/256);
}
}
m_comm.SetPortOpen(FALSE);
}
UpdateData(FALSE);
}
------解决方案--------------------
你用的是MScomm控件吗
------解决方案--------------------