收录日期:2019/07/17 12:57:54 时间:2016/05/29 20:47:24 标签:硬件/系统
当串口收到一个字符后,向符窗口发送WM_COMM_RXCHAR消息!我在父窗口处理WM_COMM_RXCHAR消息!
ON_MESSAGE(WM_COMM_RXCHAR, OnCommunication)。收到的数据放入一个数组中!
不过出现了一个怪问题!就是偶尔收到的数据中夹杂乱码,但是校验位居然是正确的!别的机器的串口调试工具收到的数据是正确的!这就说明我收到的也是正确的呀,但是有乱码,数据肯定不对!显示的时候和写文件的时候就看到错了!我用的是异或校验!晕!
不知道怎么回事!数据错了校验码就应该不对呀!不过,乱码中老有“?”,也不是全错,就很偶尔得有一个错!不知道是怎么回事?请高手指教一二!
代码如下:Remon Spekreijse的类我没有改动,我的响应函数如下:
LONG 
CMycomDlg::OnCommunication(WPARAM ch, LPARAM port)

DestroyBeginSend(); // 停止发送
DestroyTime255();
BeginTime255();
if(bReceive)
{
ppp[n]=(BYTE)ch;

if(ch!=NULL)
{
//char buf[10];
//sprintf(buf,"%02x",(char)ch);
m_edit_rec+=ch; // m_edit_rec+=buf; //16进制显示
}

//UpdateData(FALSE);
n++;
if(n>5000)
{
ShowMess("数据太大");
InitSystem();
}
// 0a0d dtr920sv1.1-start 0a0d
if(ppp[0]==0x0a && ppp[2]==0x44 && ppp[20]==0x0d)
{
// 显示上位机开始工作
ShowMess("上位机开始工作");
InitSystem();
BeginSend();
}
// 0x68 0x01 0x68 0x02
else if (ppp[0]==0x68)
{
memset(pdaArray,0,sizeof(pdaArray));
subscript=0;
// 开始计时,1秒钟后调用ProcessPdaArray()
ReceivePda();
}
//0x45……0x16
else if(ppp[0]==0x45)
{
BeginTimeOut1();

DestroyTimeOut2();
DestroyTimeOut3();

if(ppp[n-1]==0x16||ppp[n-1]==0x3f)
{
DestroyTimeOut1();
UpdateData(FALSE);
//Sleep(150);
ProcessData();
BeginTimeOut2();

if(subscript<len)
{
ProcessPdaID();
errorcount=0;
}
if(subscript==len)
{
DestroyTimeOut2();
errorcount=0;
InitSystem();
BeginSend();
}
}
}
}
return 0;
}
没有高手?
up
乱码?什么乱码?汉字乱码?如果是汉字乱码是不是数据没有按照双字节对齐?你的效验码怎样得到?异或效验?你自己的效验方法?串口自己的效验方法中好像没有你说的这种
没有汉字!没有英文!就是数字和逗号,叹号,分号!串口自己的校验我没有!
乱码应该是baudrate的问题,检查一下你设置的baudrate是否正确,用超级终端调试一下就可以了.
Remon Spekreijse写的串口类质量太差,不但每次只能读一个字节,而且还给你发消息(把自己堵塞了),
MSDN的解释
The SendMessage member function calls the window procedure directly and does not return until that window procedure has processed the message. This is in contrast to the PostMessage member function, which places the message into the window's message queue and returns immediately. 


如果单片机不停的向PC发数据,你这样写的话,串口驱动的缓冲区会溢出丢失数据,尤其是
// 开始计时,1秒钟后调用ProcessPdaArray()
ReceivePda();

你不妨试试将
m_edit_rec+=ch; // m_edit_rec+=buf; //16进制显示
UpdateData(FALSE);
后面的代码先注意掉看看

AthlonxpX86(桃源村) 的办法!我试试……
AthlonxpX86(桃源村) 的办法,我试了,好像还是不行!收到的就是错的!
错误的字节正确的应该是什么?是特定的错误还是随机的?给详细点
怎么关闭这个类打开的串口?
http://www.gjwtech.com/scomm/sc2serialportclass.htm
void CSerialPort::ClosePort()
此类没有这一个函数.
我的类是从上面的那一个网址下载来的.
要不这样来:
void CSerialPort::ClosePort(void){

if (m_hComm != NULL)
{
CloseHandle(m_hComm);
m_hComm = NULL;
}
}
你看行不?
但是他自己的线程没有关闭,所以会出问题,按照你说的那个代码可以用
CSerialPort::~CSerialPort()
CSerialPort::~CSerialPort()
{
do
{
SetEvent(m_hShutdownEvent);
} while (m_bThreadAlive);

TRACE("Thread ended\n");

delete [] m_szWriteBuffer;
}
里面加上CloseHandle(m_hComm);
http://www.gjwtech.com/download/scporttest.zip
龚建伟修改后的这个有ClosePort
请发给我:RecievePassWord@163.net
http://www.gjwtech.com/download/scporttest.zip
自己下载
这个联接没有文件.
错误的数据是随机的,好像都是错在800字节左右!大概6-7次能错一次!不知道为什么?
实在想不出什么东东了,如果不介意,把代码发给我调试(去掉debug release文件夹),yds_086@163.com
谢谢AthlonxpX86(桃源村)了,不过,我还是想自己在调试一天,只有自己调通了才能进步嘛要是不行,在麻烦您吧!我先表示感谢了!
数据错误没关系,不过校验位正确啊!这就坏了!为什么显示不对,校验位对了呢?
周一结贴!我的问题还没解决,不过,谢谢大家了!
可能一个月内我是无法调试了,开学了,无法使用电脑,安顿好以后才可以
哦,呵呵……

使用installShield做安装文件是提示如下信息: 上海好工作机会 关于js传递变量的问题 在Dll中新建两个窗口,要求第一个窗口能调用到第二个窗口中的数据。代码如下,但是出错了 窗体相互调用的问题? 解决立刻给分,急!!! 急 急 急 请大家帮忙 谢谢了 关于MyEclips+struts 请问CString 类的函数源码在哪个文件里,能不能看到???? 她真的那么好吗> norton无法扫描病毒了 norton无法扫描病毒了 谁能帮我这段代码的功能解读一下吗? 有人做过图像金字塔融合吗? .NET学那个好??VC。NET?ASP。NET?C#。NET?????????? 求助: 红绿灯课程设计 WebGrid 模板列问题! 急死了! delete [] pia; // delete pia; 可否? asp生成html问题 如何在编辑框中右击时弹出自己的下拉菜单? 100多个字段的表,怎么往里查数据 38节,给奋斗在水源的妇女们问好了! SQL 执行计划该如何分析 关于APP_GlobalResource下资源的使用 3.8有人放假么?? 关于BORLAND C安装的问题 请问在通过FTP上传一个文件的时候,FTP服务器是否会对该文件加锁而使别的用户现在不能下载? 请问如何制作类似MessageBox的控件 ado 怎么连接远程mssql? 菜鸟问题,怎么样把资源文件中的一幅图片加载到Image类中来? 应用程序的图标问题 DirectX在创建顶点缓冲的时候为什么要先Lock,再Unlock?