串口接收到数据解包问题。help~~~~~~~~~~~~~~~~~

xzyong 2005-01-20 03:57:45
这个函数是发送数据包的
void CTestDemandDlg::SendDataPackage(CString &strData)
{
char checksum=0,cr=13,ln=10;
char c1,c2;
for(int i=0;i<strData.GetLength();i++)
{
checksum=checksum^strData[i];
}
c2=checksum & 0x0F;
c1=((checksum>>4)&0x0F);
if(c1<10) c1+='0'; else c1+='A'-10;
if(c2<10) c2+='0'; else c2+='A'-10;
CString strDataPackage;
strDataPackage="$"+strData+"*"+c1+c2+cr+ln;
char *p = strDataPackage.GetBuffer(strDataPackage.GetLength());
m_port.WriteToPort(p);
}
那么在串口接收到数据时该怎么解包呢!请指教
...全文
176 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
xzyong 2005-01-26
  • 打赏
  • 举报
回复
呵呵 我现在只有一跟线。散分。。。。。。。。。。。。。。
legendhui 2005-01-26
  • 打赏
  • 举报
回复
晕,当然要连接了,不然怎么接收啊
xzyong 2005-01-26
  • 打赏
  • 举报
回复
我解决了,还有一个问题就是发送一个数据出去怎么我在用串口调试助手时没有被接收显示啊!是不是两个串口线都要连接啊!还是什么
xzyong 2005-01-24
  • 打赏
  • 举报
回复
顶~~~~
xzyong 2005-01-24
  • 打赏
  • 举报
回复
Martin_personal(死循环出口) 兄:你写的我没看懂,我是刚学的串口。

在我上面写的接收数据时计算的校验和与发送时计算的校验和一样吗?是这样写吗???

谢了
Martin_personal 2005-01-24
  • 打赏
  • 举报
回复
把收数据的工作交给中断,或者一收到数据就放到一个缓冲区中,在另一个线程中去缓冲区里取就OK了
while(true)
{
dwEvtMask = 0;
WaitCommEvent(pDlg->hComm,&dwEvtMask,&(pDlg->npTTYInfo));//等待串口通信事件的发生
if ((dwEvtMask & EV_RXCHAR) == EV_RXCHAR)//缓冲区中有数据到达
{
CString str;
COMSTAT ComStat;
DWORD dwLength;
ClearCommError(pDlg->hComm,&dwErrorFlags,&ComStat);
dwLength = ComStat.cbInQue;//输入缓冲区有多少数据
if (dwLength > 0)
{
BOOL fReadStat;
fReadStat = ReadFile(pDlg->hComm,lpBuff,dwLength,&dwBytesRead,&(pDlg->npTTYInfo));//读数据
if (!fReadStat)
{
if (GetLastError() == ERROR_IO_PENDING)
{
while (!GetOverlappedResult(pDlg->hComm,&(pDlg->npTTYInfo),&dwBytesRead,TRUE))
{
dwError = GetLastError();
if (dwError == ERROR_IO_INCOMPLETE) continue;//缓冲区数据读完
}
}
}
pDlg->SetData2Buff(lpBuff,pDlg->End,dwLength);
HANDLE hWnd = pDlg->GetSafeHwnd();
::PostMessage((HWND)hWnd,WM_NOTIFYPROCESS,0,0);//通知主线程,串口收到数据  
}
}
}
return 0;
}
sjzxyg 2005-01-24
  • 打赏
  • 举报
回复
帮你顶
xzyong 2005-01-24
  • 打赏
  • 举报
回复
老大们看了回个贴啊!UP
xzyong 2005-01-21
  • 打赏
  • 举报
回复
串口接收到数据我是这样计算的有错吗????问题是我这里调试不了。重要是帮忙看看我在计算校验和的时候有没有错
LONG CMainFrame::OnComm(WPARAM ch, LPARAM port)
{
static char checksum=0,checksum1=0;
static unsigned char buf[20];
static char c11,c21; //计算半byte校验
static int flag2;
if (port==1)
{
m_strcard2+=(char)ch;
switch(ch) {
case '$':
checksum1=0; //开始计算checksun
flag2=0;
break;
case '*': //有效数据结束,可以$和*之间数据的半byte校验了
flag2=2;
c21=checksum1 & 0x0F;
c11=((checksum>>4)& 0x0F);
if (c11<10) c11+='0';else c11+='A'-10;
if (c21<10) c21+='0';else c21+='A'-10;
break;
case CR: //这句必须加上,否则会出错
break;
case LF: //数据包的最后一个字符
m_strcard2.Empty();
break;
default:
if (flag2>0)
{
m_strchecksum2+=ch;
if (flag2==1)
{
CString strcheck2="";
CString strmsg2;
strcheck2.Format("%c%c",c11,c21);
if(strcheck2!=m_strchecksum2)
{ //校验计算不正确,说明接收数据出错
strmsg2.Format("%s","接收到包有误,重新发送");
SendDataPackage(strmsg2);
m_strcard2.Empty();
}
else //校验计算正确,则处理数据
{
int j,b,cpdid;
BOOL bcpdid,bcpdid1;
for (j=0;j<m_strcard2.GetLength();j++)
{
if (m_strcard2.GetAt(j)=='*')
{
b=j;
}
}
CString strSwitchSetData2 = m_strcard2.Mid(1,8);

if (strSwitchSetData2=="00000010")
{//获得数据
cardid=m_strcard2.Mid(9,8);
cardmoney=m_strcard2.Mid(17,b);
}
}
m_strcard2.Empty();
}
flag2--;
}
else
checksum1=checksum1^ch; //当flag2<=0时,计算校验值
break;
}
}
return 0;
}

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧