mfc 串口通信 十六进制 显示的 问题

追风卡卡 2013-09-26 03:38:34
我这边有个传感器,给串口发送信息,要以十六进制显示!我用串口调试助手接收后是显示是正确的!但是我用MFC自己编写的串口接收的时候,显示的那个信息不对!
51 38 F9 FF 05 00 FE FF CB 02 AF 03 51 E8 A6 0B DE FD 4F
这是串口调试助手显示的十六进制消息

51 4F 00 01 66 30 C0 FF FF 1B 26 B8 CA 03 27 33 A1 0B 27 F3 1F 01 35
这是我自己程序上显示的消息

前面两个字节,51和38以及下面的51和4F是起始判断和计数的,从第三个字节开始是消息的内容!很明显两个接收显示的不一样!

我自己写的那个程序以前用过另外一个传感器,是正确的,所以我估计可能是我转换成十六进制的时候出错了!
请大家帮我看看错在哪里!


LONG CDASKDlg::OnComm(WPARAM ch, LPARAM port)
{
CString str;
str.Format("%02X ",ch);//我是这样转换十六进制的
m_strReceiveMsg+=str;
//m_strEditReceiveMsg=m_strReceiveMsg;
return 0;
}


m_strReceiveMsg是显示编辑框的成员变量
...全文
747 46 打赏 收藏 转发到动态 举报
写回复
用AI写文章
46 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
哥们,我现在读卡器接受16进制也出问题了。第三字节缺失,您那个是怎么改的?
阿先森 2013-11-01
  • 打赏
  • 举报
回复
http://download.csdn.net/detail/allenemo/6487471
追风卡卡 2013-10-31
  • 打赏
  • 举报
回复
我来结贴了,中间放置了好久,前天解决问题了!谢谢楼上的朋友们!是我校验位这边错误了!
追风卡卡 2013-10-08
  • 打赏
  • 举报
回复
引用 40 楼 flydreamGG 的回复:
用MSComm控件试试,感觉你接收函数有问题!
嗯,我这个就是以前接收CString的时候没有错误,这次传感器发送的东西,想以十六进制看看结果的,发现和串口调试助手的那个有偏差! 国庆没在线,回复晚了,见谅!
追风卡卡 2013-10-08
  • 打赏
  • 举报
回复
引用 41 楼 rxguoblp 的回复:
16进制就是16进制,为什么还要转换成CString?把你的显示用edit窗口绑定成一个BYTE或者int型变量不行吗?
我试了下,好像不可以,发送数据的是传感器,它发送的时候可能不是16进制发送的,我现在是想要在接收的时候以十六进制显示!只是好像没弄对!!!国庆不在线,没有及时回复,见谅了!
rxguoblp 2013-09-29
  • 打赏
  • 举报
回复
16进制就是16进制,为什么还要转换成CString?把你的显示用edit窗口绑定成一个BYTE或者int型变量不行吗?
昨夜无风 2013-09-28
  • 打赏
  • 举报
回复
用MSComm控件试试,感觉你接收函数有问题!
xiaohuh421 2013-09-27
  • 打赏
  • 举报
回复
你接收部分的代码是怎么写的呢? 串口本身就是字符设备, 使用char类型接收没有任何问题的. 只是对串口参数一定要跟发送设备一样, 波特率, 停止位, 位宽等等. 有可能串口助手会自动同步参数, 而你自己的程序没有设置, 导致接收的数据不正确. 这样看来, 我觉得很比较大的可能是参数配置问题. 仔细看看传感器的串口参数吧. 或者看看串口助手上显示的参数.
追风卡卡 2013-09-27
  • 打赏
  • 举报
回复
引用 17 楼 xiaohuh421 的回复:
如果断点跟踪, 第三个就错了, 那说明你本身接收到的数据就有问题了. 把你发送, 接收的代码都拿出来看看, 估计是数据发送部分有问题. 你首先要保证接收数据正确, 再来弄显示.
这个数据是链接上后,传感器自动发送的!所以发送端应该没有问题!我猜想是不是发送的数据和我接收的那个ch的类型不匹配啊! 串口调试助手如果不按十六进制显示的话,就会是乱码显示! ch是unsigned int ...会不会发送的数据有冲突了?
xiaohuh421 2013-09-27
  • 打赏
  • 举报
回复
如果断点跟踪, 第三个就错了, 那说明你本身接收到的数据就有问题了. 把你发送, 接收的代码都拿出来看看, 估计是数据发送部分有问题. 你首先要保证接收数据正确, 再来弄显示.
追风卡卡 2013-09-27
  • 打赏
  • 举报
回复
引用 15 楼 flyinskylo 的回复:
我觉得你这样弄肯定有问题,借来的数是一个字节地址转成两个字符型,你怎么弄的是一个ch占了WPARAM型肯定造成了内存的扩张,然后为什么是WPARAM型的你一个字符发一个消息吗。你从内存上看数据对不
你好,我也感觉是不是ch类型和发送数据类型不对!因为我调试的时候发现,ch接第一个的时候是正确的,第二个也可以,但第三个就错了!你看看13楼我的回复!帮我看看!
flyinskylo 2013-09-27
  • 打赏
  • 举报
回复
我觉得你这样弄肯定有问题,借来的数是一个字节地址转成两个字符型,你怎么弄的是一个ch占了WPARAM型肯定造成了内存的扩张,然后为什么是WPARAM型的你一个字符发一个消息吗。你从内存上看数据对不
schlafenhamster 2013-09-27
  • 打赏
  • 举报
回复
降低 波特率 试试
追风卡卡 2013-09-27
  • 打赏
  • 举报
回复
引用 11 楼 xiaohuh421 的回复:
转换问题不大, 建议你下断点, 看看解析前内存数据是什么, 你可以以16进制方式查看内存数据.

如果你是一个一个接收字符的, 可以先接收到一个缓冲区里, 再看内存数据, 对比调试助手中的显示.

我觉得还是你数据接收有问题.

CString str;
str.Format("%02X ",ch);
m_strReceiveMsg+=str;
是这样的,我上面代码将ch装换为十六进制,放到str这个CString里面。我看了下,原来ch好像是unsigned int ch; 而且截图的那个ch显示的十六进制是对的,但是只有开头的51,和第二个数可以,第三个就开始出错了! 51是开头的判断,第二个数是起计数作用,第三个才是正式的数据!
这样说,不晓得详不详细,请帮忙再看看!
追风卡卡 2013-09-27
  • 打赏
  • 举报
回复
引用 10 楼 hdg3707 的回复:
ch应该是字节型,不应该是char型,所以你接收的数据应该是正确的,只是类型转换错误了:先转换成字节型,再转换成十六进制显示
按您说的,我接收的时候ch是char型,显示的时候要按字节型显示,我应该先将ch转换为字节型,在转成十六进制>?我这样理解对吗?
xiaohuh421 2013-09-27
  • 打赏
  • 举报
回复
转换问题不大, 建议你下断点, 看看解析前内存数据是什么, 你可以以16进制方式查看内存数据. 如果你是一个一个接收字符的, 可以先接收到一个缓冲区里, 再看内存数据, 对比调试助手中的显示. 我觉得还是你数据接收有问题.
hdg3707 2013-09-27
  • 打赏
  • 举报
回复
ch应该是字节型,不应该是char型,所以你接收的数据应该是正确的,只是类型转换错误了:先转换成字节型,再转换成十六进制显示
追风卡卡 2013-09-27
  • 打赏
  • 举报
回复
引用 6 楼 schlafenhamster 的回复:
那是因为 有 负数。 str.Format("%02X ",(BYTE)ch);
昨天临时有事,没有及时回复,见谅! 加上BYTE后,结果还是一样的!还有什么办法吗?
追风卡卡 2013-09-27
  • 打赏
  • 举报
回复
引用 7 楼 zgl7903 的回复:
转换好像没有问题,可能你接收丢数据了



额, if(m_SerialPort.InitPort(this, nPort, 115200,'EVEN',8,2,EV_RXFLAG | EV_RXCHAR,512))
{
m_SerialPort.StartMonitoring();
m_bSerialPortOpened=TRUE;
}
else
{
AfxMessageBox("没有发现此串口或被占用");
// MessageBox("没有发现此串口或被占用");
m_bSerialPortOpened=FALSE;
}

这个是我程序里设置串口端口的信息,图片是串口调试助手的信息,这里应该没有设置错吧?
schlafenhamster 2013-09-27
  • 打赏
  • 举报
回复
LONG CDASKDlg::OnComm(WPARAM ch, LPARAM port) 能保证 一次一个 字节? 参考: // use ON_MESSAGE(a,b) void Cxxxx::OnCommNotify(WPARAM wParam,LPARAM lParam) { // TODO: Add your specialized code here and/or call the base class int nLength; BYTE abIn[6000];// for 115200 needs 4096 and more DWORD totalrecv; CString txt; switch(wParam) { case 0:// from CommWatchCTS() SetCTSIcon(); SetEvent(m_hPostEventRead);// tell watcher that CommNotify has been done break; case 1:// from CommWatchRead() // append on each entry CFile uldFile(UpLoadFileName,CFile::modeCreate|CFile::modeNoTruncate|CFile::modeWrite); uldFile.SeekToEnd( ); if (m_bConnected) { if(nLength=ReadCommBlock(abIn,BUFLEN))// 38400 needs 1024 { // save into file if (!m_bStart) { // only 1st m_bStart=1; InforOut("Receiving "+UpLoadFileName); } uldFile.Write(abIn,nLength); } } uldFile.Close(); // get total bytes received m_uldINs.GetText(0,txt); totalrecv=atol(txt.GetBuffer(40)); totalrecv+=nLength; txt.Format("%d",totalrecv); m_uldINs.ResetContent(); m_uldINs.AddString(txt); if (nLength>128) { Animate(); // reset "time waiting" m_Elapse.ResetContent(); m_Elapse.AddString("0 s"); } // tell watcher that CommNotify has been done SetEvent(m_hPostEventRead); break; } }
加载更多回复(26)

16,473

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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