当前位置: 代码迷 >> WinCE >> 串口通信,上位机解析有关问题
  详细解决方案

串口通信,上位机解析有关问题

热度:526   发布时间:2016-04-28 11:50:26.0
串口通信,上位机解析问题
各位大侠,求帮助。
本人在VS环境写了一个串口通信的程序,使用了MSCCOMM控件。有个问题,一直没有解决。
下位机发过来的数据长度为6个字节,com_data长度是1020,每次第170个(即最后一组数据)总是出现问题。
代码如下:
定义全局变量:
#define COMDATAL 6

bool comflag = false;
unsigned char com_data[1020];//COM接收数据缓存,环状数组
float ang_data[100];  //解析后的角度信息
float force_data[100];//解析后的杆力信息
float sequence_data[100];

short head = 0;//数据头,读取地址
short tail = 0;//数据尾,存放地址
int *ad1;//角度的数字量
int *ad2;//杆力的数字量   王欢添加
long tnum = 0;

void CStickDlg::OnBnClickedComok()          //确定按钮
{
// TODO: 在此添加控件通知处理程序代码
CString str1; //定义字符串
CString strCom = _T("");
GetDlgItemText(IDC_COMCHOOSE,strCom);
short Com = strCom[3] - '0';

if(!m_mscom.get_PortOpen())      //获取串口的打开状态
{
str1 = "9600,n,8,1"; //这句话很关键
m_mscom.put_CommPort(Com); //选择串口
m_mscom.put_InputMode(1); //设置输入方式为二进制方式
m_mscom.put_Settings(str1); //波特率为(波特率组?合框)无校验,8数据位,1个停止位
m_mscom.put_InBufferSize(1020);
m_mscom.put_InputLen(0);
//m_mscom.put_InputLen(1020); //设置当前接收区数据长度为1020
m_mscom.put_RThreshold(1); //缓冲区>=一个字符将引发接收数据的OnCommon事件
m_mscom.put_RTSEnable(1); //设置RT允许

m_mscom.put_PortOpen(true); //打开串口

if(m_mscom.get_PortOpen())
{
UpdateData(true);
MessageBox(_T("COM口打开成功"));
m_Comok.ShowWindow(SW_HIDE);//可见性不可见
m_Comok.EnableWindow(FALSE);//可用性不可用
comflag = true;
tnum =0;
// AfxBeginThread (ThreadFunc1,(LPVOID)this);//开启新线程  为什么是在此时?
}
else
{
UpdateData(true);
MessageBox(_T("COM口打开失败"));
return;
}
}
}

void CStickDlg::OnBnClickedComstop()   //关闭按钮
{
// TODO: 在此添加控件通知处理程序代码
if(m_mscom.get_PortOpen())
m_mscom.put_PortOpen(false);
comflag = false;
MessageBox(_T("COM口关闭成功"));
m_Comok.ShowWindow(SW_SHOW);
m_Comok.EnableWindow(TRUE);
}
BEGIN_EVENTSINK_MAP(CStickDlg, CDialogEx)
ON_EVENT(CStickDlg, IDC_MSCOMM1, 1, CStickDlg::OnCommMscomm1, VTS_NONE)
END_EVENTSINK_MAP()


void CStickDlg::OnCommMscomm1() //MSCCOMM控件 接收数据
{

// TODO: 在此处添加消息处理程序代码
if(m_mscom.get_CommEvent()==2)    //事件值为2表示接收缓冲区内有字符
{
long k;
VARIANT InputData = m_mscom.get_Input(); //读缓冲区
COleSafeArray fs;
fs = InputData; //VARIANT型变?量转换为COleSafeArray型变量
for(k=0;k<fs.GetOneDimSize();k++)
{
fs.GetElement(&k,com_data+tail); //转换为BYTE型数组
tail ++;
if(tail == 1019)
{
//pursedata();
tail = 0;
}

//fs.GetElement(&k,com_data+tail); //转换为BYTE型数组
}
//SetTimer(1,2,NULL); //延时2ms
pursedata();
UpdateData(false);
}
}
void CStickDlg::pursedata()
{
float ang = 0;
float force=0;
unsigned char snum[4];
unsigned char fnum[4];
int j=0;
CString itemstri,str;
snum[2] = 0;
snum[3] = 0;
fnum[2] = 0;
fnum[3] = 0;
//while(comflag)
//{
while(comflag&&tail!=head)
{
          if(head<tail)
  {
  if((tail-head) < COMDATAL)//等待一包数据接收完全
break;
   else
    {
  if(com_data[head]!=0XAA)
  {
  head++;
  if(head>=1020)
  {
  head-=1020;
   }
   }
  else //==oXAA
  {
  head++;
  if(head>=1020)
  {
  head-=1020;
  }
  if(com_data[head]==0X55)
  {
  head++;
  if(head>=1020)
  {
  head-=1020;
  }
  snum[1]=com_data[head];
  head++;
  if(head>=1020)
  {
  head-=1020;
  }
  snum[0]=com_data[head];
  head++;
  if(head>=1020)
  {
  head-=1020;
  }
  fnum[1]=com_data[head];
  head++;
  if(head>=1020)
  {
  head-=1020;
  }
  fnum[0]=com_data[head];
  head++;
  if(head>=1020)
  {
  head-=1020;
  }
  tnum++;
  ad1=(int*)snum;
  if(*ad1 > 4095)    *ad1 = 4095;
  ang= (*ad1-2294)*360.0/4096;
  itemstri.Format(_T("%0.2f"),ang);
  m_dialog1.m_ang.SetWindowText(_T(itemstri));
  m_dialog1.GetDlgItem(IDC_ANG_EDIT)->GetWindowText(str);
  m_dialog1.SaveFileString1(str,"C:\\Documents and Settings\\DELL\\桌面\\TestStick1.2\\data.txt");
  ad2=(int*)fnum;
  if(*ad2 > 4095)    *ad2 = 4095;
  if(*ad2>1564)     force= (*ad2-1564)*300.0/1449;    //正向杆力信息
  if(*ad2<=1564)    force= (*ad2-1564)*300.0/1564;    //负向杆力信息
 itemstri.Format(_T("%0.2f"),force);
 m_dialog1.m_force.SetWindowText(_T(itemstri));
 m_dialog1.GetDlgItem(IDC_FORCE_EDIT)->GetWindowText(str);
 m_dialog1.SaveFileString2(str,"C:\\Documents and Settings\\DELL\\桌面\\TestStick1.2\\data.txt");
 ang_data[j]=ang;
 force_data[j]=force;
 sequence_data[j]=j;
 j++;
 if(j=99) 
{    
j=0;
//disposedata();

  }
  }
   }
  }
  else //head>tail
  {
if((tail+1020)-head < COMDATAL)//一包数据未接收完
           
break;
    else
{
            if(com_data[head] != 0xAA)
{
  head++;
  if(head >= 1020)
head -= 1020;
}
else
{
  head++;
  if(head >= 1020)
head -= 1020;
  if(com_data[head] == 0x55)
  {
head++;
    if(head >= 1020)
{
  head -= 1020;
}
snum[0] = com_data[head];
head ++;
if(head >= 1020)
{
  head -= 1020;
}
snum[1] = com_data[head];
head ++;

 if(head >= 1020)
{
  head -= 1020;
}
fnum[0] = com_data[head];
head ++;
if(head >= 1020)
{
  head -= 1020;
}
fnum[1] = com_data[head];
head ++;

if(head >= 1020)
{
  head -= 1020;
}
tnum ++;
ad1 = (int*)snum;
if(*ad1 > 4095)  *ad1 = 4095;
ang= (*ad1-2294)*360.0/4096;
itemstri.Format(_T("%0.2f"),ang);
m_dialog1.m_ang.SetWindowText(_T(itemstri));
m_dialog1.GetDlgItem(IDC_ANG_EDIT)->GetWindowText(str);
m_dialog1.SaveFileString1(str,"C:\\Documents and Settings\\DELL\\桌面\\TestStick1.2\\data.txt");
ad2 = (int*)fnum;
if(*ad2 > 4095)     *ad2 = 4095;
    if(*ad2>1564)     force= (*ad2-1564)*300.0/1449;    //正向杆力信息
if(*ad2<=1564)    force= (*ad2-1564)*300.0/1564;    //负向杆力信息
//force= (*ad2-1634)*200.0/4096;
itemstri.Format(_T("%0.2f"),force);
m_dialog1.m_force.SetWindowText(_T(itemstri));
m_dialog1.GetDlgItem(IDC_FORCE_EDIT)->GetWindowText(str);
m_dialog1.SaveFileString2(str,"C:\\Documents and Settings\\DELL\\桌面\\TestStick1.2\\data.txt");
ang_data[j]=ang;
force_data[j]=force;
sequence_data[j]=j;
j++;
if(j=99) 
{    
j=0;
//disposedata();

  }
 }
   }
  }
    }
}

数据如下:
-1.14 -37.21
-0.62 -36.83
-0.70 -36.64
-0.79 -36.64
-0.70 -37.02
-0.88 -37.21
-0.79 -37.02
-0.18 -36.83
-0.79 -37.21
-0.88 -37.02
-0.62 -36.83
-0.70 -36.64
-0.53 -36.83
-0.88 -37.40
-1.14 -37.40
-0.79 -36.83
-0.35 -36.64
-0.53 -36.64
-0.97 -37.02
-0.88 -37.02
-0.70 -36.83
-0.79 -36.64
-0.79 -37.21
-0.97 -37.40
-0.88 -37.02
-0.35 -36.83
-0.44 -36.64
-0.97 -37.02
-0.88 -37.02
-0.70 -37.02
-0.62 -36.64
-0.97 -36.83
-0.53 -36.64
-0.79 -37.21
-1.14 -37.40
-0.35 -36.45
-0.35 -36.64
-0.62 -36.83
-0.97 -37.02
-0.62 -36.83
-0.70 -36.64
-0.70 -36.64
-0.70 -36.83
-0.79 -37.40
-1.14 -37.21
-0.70 -36.83
-0.09 -36.64
-0.53 -36.83
-0.97 -37.02
-0.97 -37.02
-0.62 -36.83
-0.70 -36.64
-0.88 -36.64
-0.53 -36.83
-0.79 -37.40
-1.23 -37.21
-1.05 -37.21
-0.26 -36.45
-0.18 -36.83
-0.79 -37.02
-1.14 -37.02
-0.97 -37.02
-0.70 -37.02
-0.70 -36.64
-0.79 -36.64
-0.79 -36.64
-0.79 -36.64
-0.70 -36.83
-0.97 -37.21
-1.14 -37.21
-0.44 -36.64
-0.35 -36.64
-0.53 -36.64
-0.97 -37.02
-1.05 -37.21
-0.79 -37.02
-0.62 -36.64
-0.79 -36.64
-0.88 -36.64
-0.44 -37.02
-1.05 -37.21
-1.05 -37.21
-1.14 -37.21
-0.79 -36.64
-0.09 -36.64
-0.44 -36.83
-0.62 -36.64
-1.05 -37.21
-0.97 -37.02
-0.70 -36.83
-0.97 -37.02
-0.35 -36.64
-0.88 -36.64
-0.70 -36.64
-0.70 -36.64
-0.79 -36.83
-0.44 -36.83
-0.79 -37.21
-0.88 -37.21
-1.23 -37.21
-0.88 -37.02
-1.14 -37.21
-0.97 -37.02
-0.88 -36.83
-0.44 -36.64
0.00 -36.64
-0.79 -36.64
-0.35 -36.64
-1.23 -37.21
-1.05 -37.21
-1.14 -37.02
。。。。。。。。
-1.14 -37.21
-0.97 -37.02
-1.14 -37.21
-0.79 -37.02
-0.97 -37.21
-0.62 -36.83
-0.97 -37.21
-0.53 -36.83
-1.05 -37.21
-0.44 -36.64
-1.14 -37.02
-0.44 -36.64
-0.79 -37.02
-0.53 -36.64
-0.79 -36.83
-0.62 -37.02
-1.14 -37.02
-0.79 -37.02
-1.14 -37.21
-0.79 -36.83
-0.97 -37.21
-0.97 -37.02
-0.88 -37.02
-0.88 -37.02
-0.79 -37.02
-0.88 -36.83
-1.05 -37.21
158.29 -54.48
-0.88 -37.02
-0.88 -37.02
。。。。。。。。。。。。。。。
-0.35 -36.64
-0.53 -36.83
-1.05 -37.21
-1.23 -37.40
-0.79 -37.21
-0.79 -37.21
-1.14 -37.02
-1.14 -37.21
-0.44 -36.64
-0.35 -36.83
-0.35 -36.64
-0.26 -36.45
-1.23 -37.40
-1.05 -37.40
-0.79 -37.21
-0.70 -36.83
-0.88 -36.64
-0.70 -36.64
-0.44 -36.83
-1.05 -37.21
-0.97 -36.83
-0.70 -36.83
-0.44 -36.83
-0.44 -36.64
-0.97 -37.40
-1.05 -37.40
-0.62 -36.64
-0.79 -36.64
-0.79 -36.64
-0.79 -37.02
-0.97 -37.02
-0.53 -36.64
-0.35 -36.64
-0.62 -36.83
-0.97 -37.21
-0.62 -37.02
-0.97 -36.64
-0.70 -36.83
-1.05 -37.21
-0.53 -36.64
-0.35 -36.64
-0.70 -36.64
-0.88 -37.21
-0.88 -37.21
-0.70 -36.64
-0.70 -36.64
-0.79 -36.64
-0.97 -37.02
-1.14 -37.02
-0.79 -36.83
0.00 -36.64
-1.05 -37.02
-1.23 -37.60
-0.44 -36.83
-0.79 -36.64
-0.79 -37.02
-1.14 -37.02
-0.70 -36.83
-0.18 -36.64
-1.05 -37.21
-1.05 -37.21
-0.62 -36.83
-0.70 -36.64
-0.44 -36.83
-1.14 -37.02
-0.44 -36.64
-0.62 -36.83
-0.97 -37.21
-0.88 -36.83
-0.79 -36.64
-0.44 -36.64
-1.05 -37.21
-1.23 -37.21
-0.26 -36.83
-0.53 -36.64
-1.14 -37.21
-0.97 -37.40
-0.88 -36.64
-0.79 -36.64
-0.70 -37.02
-0.62 -36.64
-0.44 -36.64
-1.14 -37.21
-0.62 -37.21
-0.62 -36.83
-0.97 -36.83
-0.79 -37.02
-1.05 -37.02
-0.44 -36.64
-0.35 -36.64
-200.92 -9.40
。。。。。。。。。。。 
------解决思路----------------------
既然是环形缓冲区,大小不需要和数据包一致,可以设大一些,看看问题是否还在
------解决思路----------------------
tail ++;
if(tail == 1019) //最后一个字节被你吃了,返回0应该是在1020的时候
{
//pursedata();
tail = 0;
}
  相关解决方案