收录日期:2019/04/24 08:31:13 时间: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(桃源村)了,不过,我还是想自己在调试一天,只有自己调通了才能进步嘛要是不行,在麻烦您吧!我先表示感谢了!
数据错误没关系,不过校验位正确啊!这就坏了!为什么显示不对,校验位对了呢?
周一结贴!我的问题还没解决,不过,谢谢大家了!
可能一个月内我是无法调试了,开学了,无法使用电脑,安顿好以后才可以
哦,呵呵……

■■■■■■MM紧急来电,特来求救!!!■■■■■■【求助】 杭州文三路房子出租 网页上的表单为何不能输入email? 如何取到DATAGRID中行的值?????? 请教两题!(在线等) 无法进入BIOS,开机无响应,我把几年来电脑故障做个总结,请有经验的高手给个说法 哪里能下载有glaux.dll文件?,希望您能提供。 求一算法,请帮忙! ASP中有日历控件吧? 如何在同一虚拟机的两个进程之间交换数据? 小问题,先来先得10分! 为什么他不居中?第一个cell还那么长?谁能美化美化啊? 关于ConsoleReader.java 请问如何在程序中直接访问资源,特别是工具栏资源 急需XP professional 的CDKEY ! 马上给满分! 有谁知道ca的jasmine到哪下载吧 急需XP professional 的CDKEY ! 马上给满分! 请问如何操作一个文件,内详 急!我在进行数据转换是出现\"未能创建DTS包实例\" 请问xp下用ghost备份c盘,为什么老是说image actual size less than reported size 愁啊!不给加工资!散点分吧! 大家来帮帮我!!!!!!!! 请教一个关于表单检测的问题? adoconnection.create里参数应该传什么呀?我不想在form里加ado,而在手工代码里加ado 怎样获得系统进程列表,怎样获得进程号 各位大虾,ORACLE中上一月的函数是什么,怎么自动用函数表示当前日期的上一月?深表感谢! int类型的变量为何可打出上十万的数!!!!! 文件如何上传? MAIN居然可以被调用!!!! 请问大家打开数据库多数用什么方式? ADO 还是 DAO ?