我用MScomm编写一个串口程序,之前遇到了许多问题,已经在这里发帖问过大家了,不过现在还是有问题,恐怕还要继续发帖求救,呵呵
     我的任务是从一个下位机里接收数据,在PC机里面用VC6做一个基本的对话框,在里面将从下位机里收到的数据显示出来,这些数据包括探头电压,测量厚度,设备状态;还要通过对话框把一些控制信息发送到下位机,这些要发送的数据有设定时间,设定厚度。
现在有几个问题我解决不了:
    1:我用一个编辑框显示从串口读到的数据,这些数据按说只有个别位变化,即12**56**90,只有*号表示的位是变化的。但是接收到的数据是“滚动的”,比如这一刻是123456789,下一刻就是345678912,在下一刻就是567891234;这是为什么呢?该怎样解决?
     2:发送与接收冲突。我希望在数据的接收的同时能够向下位机发送数据,但是但我发送的时候,发现显示接收的编辑框里面会多出几个数字:456***789,是不是串口发送与接收不能同时造成的?该怎样修改才能让接收的编辑框不受发送的影响?加延迟?
    3:从下位机里发送的数据有AB两路,这两路是完全一样的。因为探头电压有正负之分,所以为正时发送5位数据,为负时多发送一位---负号。因此总的数据有时是40位,有时是42位(每一路发送的数据是20位或者21位),其中3~6位是测量厚度,8~10位是设备状态,11~15位是探头电压(如果电压为负则是11~16位)。现在都问题是使用什么函数来取得这些数据?我用的是测量厚度A:m_strShow.mid(3,4);设备状态A:m_strShow.mid(8,3);探头电压A:m_strShow.mid(11,6);测量厚度B:m_strShow.mid(24,4);设备状态B:m_strShow.mid(29,3);探头电压B:m_strShow.mid(32,6);不过当电压出现正负变化时,B路的读取就出现问题了:因为在A路有一个正负位的变化,因此A路发送的数据就会有20位或21位的变化,这样mid()函数中第一个参数就不容易确定了。有没有一个好的函数来解决这个问题?我觉得mid()函数用着不太方便,哪位网友能帮我想出一个好一点点的代码?
    把我的代码的主要部分写出来:
串口初始化部分:
         m_Com.SetSettings(m_strSetting);
m_Com.SetRThreshold(42);
m_Com.SetInputMode(1);
m_Com.SetInputLen(42);
串口响应函数:
void CMyCommDlg::OnOnCommCommtral() 
{
// TODO: Add your control notification handler code here
COleVariant myVar;
COleSafeArray SafeArray_inp;
LONG len,k;
BYTE rxdata[BUFSIZE+2];
CString tempThick;
float tFthick;
if (bReceive)
{
if (m_Com.GetCommEvent()==2)
{
myVar=m_Com.GetInput();
SafeArray_inp=myVar;
len=SafeArray_inp.GetOneDimSize(); for (k=0;k<len;k++)
{
SafeArray_inp.GetElement(&k,rxdata+k);
}
m_strShow.Format("%s",rxdata); m_strProbeVoltA=m_strShow.Mid(11,6);
m_strStateA=m_strShow.Mid(8,3);
tempThick=m_strShow.Mid(3,4);
tFthick=atof(tempThick)/1000;
m_fThickA.Format("%.3f",tFthick); m_strProbeVoltB=m_strShow.Mid(32,6);
m_strStateB=m_strShow.Mid(29,3);
tempThick=m_strShow.Mid(24,4);
tFthick=atof(tempThick)/1000;
m_fThickB.Format("%.3f",tFthick);         }
}
UpdateData(FALSE);
}
m_Com.GetInput();
希望大家帮帮我,谢谢

解决方案 »

  1.   

    谢谢你的回答,现在已经知道问题的关键是我接收的数据不是定长的,然而又不知道何时为40位,何时为41位,何时为42位,所以就麻烦了。这种情况下我想应该把接收缓冲区的大小设为1,即m_Com.SetRThreshold(1);但问题是在响应函数中该怎样编程接收到这40/41/42位数据?
    或者抛开控件,使用API函数编写串口程序,可以解决这些问题吗?
      

  2.   

    你的下位机,是定时发送数据 还是需要上位机查询命令再发送?//接收到40个数据之后,Sleep一下后再接收一次。