首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

串口使用队列的有关问题

2013-01-23 
串口使用队列的问题MFC由于串口数据比较多传输速率比较快(115200),我使用mscomm的时候发现会有丢包现象,于

串口使用队列的问题
MFC由于串口数据比较多传输速率比较快(115200),我使用mscomm的时候发现会有丢包现象,于是想使用多线程和队列,但是总不能实现。请大家指教一下。
部分源程序
#include <queue>
using namespace std;
 queue <CString> myqueue;
CWinThread* pThread;
UINT Fun1Proc(LPVOID lpParameter)//线程函数
{
CReadData* lpObject = (CReadData*)lpParameter;
int inde=-1;
CString str1="5354414e44415244454e44";//数据结束标志 
CString strbmp;
CReadData m_pthis;
while(myqueue.size()!=0)
{
if(!myqueue.empty())
{
  strbmp = myqueue.front();
  m_pthis.buffer+= strbmp;
  myqueue.pop();
  inde = m_pthis.buffer.Find(str1);
  if (inde!=-1)
  {
      inde=-1;
    AfxEndThread(0);
          }
}

}
return 0;
}
void CReadData::OnOpenCOM() //打开串口按钮程序
{
pThread=AfxBeginThread((AFX_THREADPROC)Fun1Proc,this);
//打开串口等一系列操作
m_ctrlComm.SetCommPort(ComNum);
m_ctrlComm.SetInputMode(1);
m_ctrlComm.SetInBufferSize(4096);
m_ctrlComm.SetOutBufferSize(512);
m_ctrlComm.SetSettings("115200,n,8,1");
..........
m_ctrlComm.SetRThreshold(8);//每8个字节进入消息响应函数
m_ctrlComm.SetInputLen(0);
m_ctrlComm.SetInBufferCount(0);
m_ctrlComm.SetOutBufferCount(0);
}
void CReadData::OnOnCommMscomm1() 
{
// TODO: Add your control notification handler code here

VARIANT variant_inp;
COleSafeArray safearray_inp;
LONG len,k;
BYTE rxdata[1024]; //设置BYTE数组 An 8-bit integerthat is not signed.
CString strtemp;
CString strtemp0;
switch(m_ctrlComm.GetCommEvent())
{
case 2:

{

  variant_inp=m_ctrlComm.GetInput(); //读缓冲区
safearray_inp=variant_inp; //VARIANT型变量转换为ColeSafeArray型变量
len=safearray_inp.GetOneDimSize(); //得到有效数据长度
for (k=0;k<len;k++)
{
safearray_inp.GetElement(&k,rxdata+k);
}

        for(k=0;k<len;k++) //将数组转换为Cstring型变量
{
BYTE bt=*(char*)(rxdata+k); //字符型
strtemp.Format(_T("%02x"),bt); //将字符送入临时变量strtemp存放
myqueue.push(strtemp);//////////入队        }
         m_ctrlComm.SetOutBufferCount(0);
 m_ctrlComm.SetInBufferCount(0);
 }
 break;
default:
 break;
}
}
请大侠指教

[解决办法]
为什么不用线程 + ReadFile?开一个大的缓冲区,去掉动态申请的部分,去掉字符串转换。

[解决办法]
mscomm的时候发现会有丢包现象.

你自己串口通信难道不用自定义通信协议么?
[解决办法]
通信需要双方配合,找到最佳配合时间,同时串口通信不能保证是100%的正确,要有错误的处理,你先拿串口助手试试有没有丢包的问题,如果串口助手也有丢包的问题,就看下位机发送速度是不是过快了,或下位机是不是有干扰造成的.因为计算机的操作系统是多任务系统,所以不能要求下位机发送报文的时间间隔太快,最好大于55毫秒的间隔发送报文件.同时你还要把算是部分放在线程里,MSCOMM只管接收放在缓冲区里,不能处理(除非单片机发关报文时间间隔有足够的长,比如500毫秒以上,这样上位机就有时间接收完后进行处理),
[解决办法]
把握手方式改为硬握手
[解决办法]
你的线程解析完数据后就退出了,所以你或者改成线程里死循环,当有数据就解析数据,没有数据就空循环;或者是接收到数据后就启动线程,但这种方法必须要求下位机不能过快发送数据,得保证上位机处理完数据后再发下一帧数据

热点排行