串口通讯当中为什么会出现收不到0的现象?

edd 2001-01-03 09:54:00
用超级终端接收的时候,别的unsigned char都正常,就是0都收不到,自己和自己用同样的通讯函数做的通讯程序试验可以接收到,谁知道什么情况下会出现这种现象吗?
...全文
491 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
witsoft2000 2001-01-04
  • 打赏
  • 举报
回复
我用的和你不一样,我用的是标准API创建自己的类,因为我还要控制的更细一些,MRBOY先生说的有道理,你可以去试一试
mrboy 2001-01-04
  • 打赏
  • 举报
回复
建议用 二进制模式 收发数据。
edd 2001-01-04
  • 打赏
  • 举报
回复
我是先用一个unsigned char数组存储要发送的数据,然后写到串口,关键是超级终端收不到0,我用同样都用自己的通讯函数做的两个程序之间就能接收到0,好像感觉是什么地方设置不对造成的。我用的是流行的那个CSerial类,上一次作类似的程序我也用这个类做的,一点问题都没有,这次和别人通讯就不正常,用超级终端一看,发现没有0,而且0xa都被添加上一个0xd。但是我自己的程序之间接收发送一切正常、
witsoft2000 2001-01-04
  • 打赏
  • 举报
回复
是呀,你把要传输的数据先放入内存缓冲区(BYTE型),然后写到串口,应该没有问题。但如果你的串口是485的可要注意一下,传输之前要把电平拉起来。
edd 2001-01-04
  • 打赏
  • 举报
回复
但是别人的程序可以用超级终端收到0。而且我发现我发送的0xa前面都被加上了0xd,也就是被当作会撤换行了。似乎全部被当作文本信息接受,但是我看msdn里面说win32串口只有二进制传输模式的
edd 2001-01-04
  • 打赏
  • 举报
回复
好像是这样,我换的机器是winme操作系统,好像在win98下面超级终端的捕获文本功能是把接收到的信息按照文本文件存储,所以就去掉了0和加上回车换行。winme大概不是这样,谁有兴趣的可以自己试验一下。
edd 2001-01-04
  • 打赏
  • 举报
回复
找到原因了,原因就是..........不明白,反正在那台机器上就是不行,换一台机器就可以了,别的机器发给那台机器,或者那台机器发给别的机器,用超级终端接收所有的0都不见了,0a前面会自动加上0d,用我自己的程序就正常。换一台机器就不管用我的程序还是超级终端都正常,不知道为什么,找不到原因。
witsoft2000 2001-01-04
  • 打赏
  • 举报
回复
HANDLE CComDev::OpenComm( LPCSTR lpszComCtrl )
{
ASSERT( lpszComCtrl != NULL );

if(m_idComDev != INVALID_HANDLE_VALUE) return m_idComDev;

CString szPort;
szPort.Format(_T("COM%u"),GetPort());

if((m_idComDev = CreateFile(szPort,GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED,NULL)) == INVALID_HANDLE_VALUE)
{
CString szErr;
szErr.Format(_T("打开串口%u失败. <CE-%u>"),GetPort(),GetLastError());

return INVALID_HANDLE_VALUE;
}

if(!SetCommMask(m_idComDev,EV_RXCHAR)|| !SetupComm(m_idComDev,MAXRECEIVEBUF,MAXSENDBUF)
|| !PurgeComm(m_idComDev,PURGE_TXABORT|PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR))
{
CString szErr;
szErr.Format(_T("设置串口%u失败. <CE-%u>"),GetPort(),GetLastError());

CloseHandle( m_idComDev );
m_idComDev = INVALID_HANDLE_VALUE;

return INVALID_HANDLE_VALUE;
}

COMMTIMEOUTS CommTimeOuts;
CommTimeOuts.ReadIntervalTimeout = 0xFFFFFFFF; CommTimeOuts.ReadTotalTimeoutMultiplier = 0; CommTimeOuts.ReadTotalTimeoutConstant = 1000; CommTimeOuts.WriteTotalTimeoutMultiplier = 0; CommTimeOuts.WriteTotalTimeoutConstant = 1000;
SetCommTimeouts( m_idComDev, &CommTimeOuts );

if(!SetupConnection(lpszComCtrl))
{
CloseHandle(m_idComDev);
m_idComDev = INVALID_HANDLE_VALUE;

return INVALID_HANDLE_VALUE;
}

m_bConnected = TRUE;

EscapeCommFunction(m_idComDev,SETDTR);
return m_idComDev;
}

int CComDev::WriteComm( BYTE FAR* lpszBuffer, int nWrite )
{
if(m_idComDev==INVALID_HANDLE_VALUE||lpszBuffer==NULL||nWrite<=0) return 0;

DWORD NumberOfBytesWritten=0;
if(!WriteFile(m_idComDev,lpszBuffer,(DWORD)nWrite,(LPDWORD)&NumberOfBytesWritten,&osWrite))
{
DWORD dwErrorFlags;
if(GetLastError()==ERROR_IO_PENDING)
{
CommTimeOuts.WriteTotalTimeoutConstant

while(!GetOverlappedResult(m_idComDev,&osWrite,(LPDWORD)&NumberOfBytesWritten,TRUE))
{
DWORD dwError = GetLastError();
if(dwError==ERROR_IO_INCOMPLETE)
continue;
else
{
CString szErr;
szErr.Format(_T("写串口%u错误. <CE-%u>"),m_btPort,dwError );

ClearCommError( m_idComDev, &dwErrorFlags, NULL );
if(dwErrorFlags>0) szErr.Format(_T("%s <CE-%x>"),szErr,dwErrorFlags);

break;
}
}
}
else
{
ClearCommError( m_idComDev, &dwErrorFlags, NULL );
if(dwErrorFlags>0)
{
CString szErr;
szErr.Format(_T("写串口%u错误. <CE-%x>"),m_btPort,dwErrorFlags);
}

return 0;
}
}

if(NumberOfBytesWritten>0)
TraceToMonitor(M_COMM,M_SEND,(char*)lpszBuffer,NumberOfBytesWritten);

return NumberOfBytesWritten;
}
edd 2001-01-04
  • 打赏
  • 举报
回复
msdn里面说win32只能用二进制模式发送数据,我也已经设为二进制发送了,但是不知道为什么超级终端还是当作文本接收,但是别人从单片机上发出来的数据就不会这样。
witsoft2000,能把你的串口类email给我吗?我急死了。
我现在dcb的奇偶校验,数据位,停止位,等等都是设置了,就是流控制采用的却省的,是不是还这个地方有问题?但是我试验了各种流控制结果都还是一样,实在搞不清楚了。、
mmmyyyaaa 2001-01-03
  • 打赏
  • 举报
回复
witsoft2000说的是对的,可以采用下面的方法。
其实你的程序接受到了数据,只是你没有取出来,使用memcpy把数据拷贝到自己的缓冲区里去。
memcpy的字节数参数,使用你的串行口类或者控件提供的数据大小。
witsoft2000 2001-01-03
  • 打赏
  • 举报
回复
是不是超级终端把0当成了结束符了
1、软件说明 ecom串口助手是一款串口(RS232)调试软件。由我爱IC导航网(http://www.52ic.net/)工作室开发。 ecom串口助手支持常用的1200 ~ 921600bps波特率,能设置校验、数据位和停止位,能以ASCII码或十六进 制接收或发送任何数据或字符(包括中文),能发送任意大小的文本文件,可以任意设定自动发送周期, 并能将接收数据保存成文本文件。 是工程师调试单片机串口的好助手工具。 2、软件特点 1、 支持Windows 9x / 2000 / XP / 2003 / Vista / Win7系统; 2、 绿色软件,不需安装。运行解压软件,将压缩包解压到指定目录即可。卸载时只需将程序目录删除; 3、 支持常用的1200 ~ 921600bps波特率; 4、 端口范围是COM1-COM255,支持扩展端口(USB转RS232); 5、 能设置校验、数据位和停止位; 6、 能以字符或十六进制收发数据,支持中文字符的收发; 7、 支持文件数据的发送; 8、 数据发送区允许设置发送周期,自动发送数据; 9、 支持键盘输入,将键盘数据发送到串口; 10、 支持定时保存接收窗口数据,便于查看长时间调试记录信息; 11、 有效的检测通讯错误,避免软件死机(如USB转串口设备拔出检测); 12、 数据接收窗口及文件发送均采用多线程设计,避免软件时机现象。 3、使用许可 本软件为免费软件,许可"个人用户"自由使用,复制和分发此软件包,但要保证此软件包的完整性。您 不能将本软件用于商业目的,如需要商业使用,需得到软件作者的授权许可。 4、关于我爱IC导航网 最专业的电子导航网,IT导航网。我爱IC导航网(http://www.52ic.net)定位为嵌入式行业、IT行业最权 威的分类网站导航网站,力求将最新最好最全的网站推荐给广大从事的IT行业的朋友。网站的宗旨是方便从事 嵌入式行业、IT行业的工程师、采购及管理者快速找到自已需要的网站,而不用去记太多复杂的网址;同时提 供了IC数据手册搜索及知名搜索引擎入口等服务项目,让您轻松愉快的享受网络给您工作带来便利和乐趣。 我爱IC导航网(http://www.52ic.net)主要以电子行业资料为中心,提供丰富的,最常用和快捷的网站链接 和各类工具。其中包括了数据手册搜索,各类电子原厂链接,各家授权代理链接,知名的行业网站链接,技术论 坛链接等,也提供了包括日常使用的工具,如快滤波器计算,三极管开关饱和度计算,在线翻译,天气查询等实 用工具。同时,我爱IC导航网还提供了用户常用的生活链接,如邮箱,音乐,视频,体育,军事等众多知名网站 链接。 我爱IC导航网,技术精灵频道(http://ee.52ic.net)主要是为电子工程师学习嵌入式技术提供良好的平台。 站长及朋友在本站上写下工作中的经验以供大家学习,同时从网上精选有价值的文章供电子工程师在项目中 参考。网站尽可能的减少广告的投放,保证文章的可阅读性。 5、版权申明 Copyright(C) 2011-2020, 52ic.net All rights reserved. E-Mail: iepixie@126.com WWW : http://www.52ic.net http://ee.52ic.net
全面提速:穷举讲究的是时效,在最短的时间内把所有的密码都测试完。影响解密时间的最大原因是通讯等待时间,根据串口的性能不同,等待返回数据的时间也不尽相同,时间太短数据还没有完全接收完,造成数据丢失,时间长了导致穷举时间太久,浪费时间。我戴尔D630笔记本的数据返回等待时间是43毫秒,USB-232转接的等待时间是58毫秒。你可以检测一下你的响应时间是多少,以检测COM口的优劣。软件自动侦测最小的等待时间,精确到毫秒,一丝一毫不流失,一点时间不浪费,每穷举一次节省10毫秒,最后的解密时间可能就是节省了几天。 最近更新:1、有网友反映站号不为默认则无法联机,现在更新了站号选择功能,并且自动搜索波特率。 2、增加了串口通讯调试功能,可以自己发送字符研究PLC解密,无需输入站号和校验码,直接点击发送即可。 3、修复了部分USB转232通讯速率较低,而跳过密码的现象。此软件是专门用于破解台达的4位无错误次数保护的密码的。可以区分大小写,可以勾选不同的字符,这样解密速度就快多了,一般字母与数字组合的几小时搞定。 4、最近增加了直读功能,当然只能直读早期的老版本PLC,最新版本的只能穷举。 使用窍门:此次升级重点是支持485通讯,无论用编程口还是用485通讯口都可以正常通讯。所以提高效率的方法就来了,您可以同时使用两个通讯口解密,时间缩短一半,事半功倍。 如果您的电脑没有两个COM口,这也没有关系,加一个USB-COM口即可。再不然也可以用两台电脑同时解密。 经我测试:编程口解密速度远远大于485通讯口。所以解密重点放在编程口上。相同的时间设置,485口解密要比编程口整整慢了一半。 如果出现连接错误,说明通讯波特率非出厂设置,您只需把PLC置于编程状态即可。 智能软件:如果您的PLC设置了密码错误次数保护,此软件是不运行的。解密前有提示告诉你加密方式和级别,绝对不因为输入错误次数过多而锁机保护,软件初始通讯就做各种检测,包括型号检测,加密方式检测,是否还有8位的 PLC识别码 保护等等。 文件解密:采用 WPL Soft 2.46 版测试完成,支持WPL Soft 2.4*,至于低版本的未经测试,情况不明。不过低于2.40版本的文件可以用此版本编程软件打开,然后另存为***即可破解。所经过测试的型号见下图,保证下图中的型号都可以破解,并且全部测试正常。那么多的型号一看就晕了,其实只有四种文件,细心的人们发现的,你看看下图中文件的大小,基本就四种类型,至今为止还没有发现第五种,谁有发现立刻告诉我,给予更新. 更新了什么??? 1.可以设置起始穷举密码,支持断线后的重新开始,节省时间. 2.精准计算所需时间, 增加进度条. 3.文件解密支持全球各国多语言识别. 4.更智能的根据你输入的起始密码自动勾选所包含的字符类型. 5.增加了型号探测功能,可以识别PLC型号. 6.极致提速,超级算法,不能再快了.通讯时间取决于波特率和编程电缆的好坏.
台达EH ES EV SV等系列PLC解密软件 全面提速:穷举讲究的是时效,在最短的时间内把所有的密码都测试完。影响解密时间的最大原因是通讯等待时间,根据串口的性能不同,等待返回数据的时间也不尽相同,时间太短数据还没有完全接收完,造成数据丢失,时间长了导致穷举时间太久,浪费时间。我戴尔D630笔记本的数据返回等待时间是43毫秒,USB-232转接的等待时间是58毫秒。你可以检测一下你的响应时间是多少,以检测COM口的优劣。软件自动侦测最小的等待时间,精确到毫秒,一丝一毫不流失,一点时间不浪费,每穷举一次节省10毫秒,最后的解密时间可能就是节省了几天。 最近更新:1、有网友反映站号不为默认则无法联机,现在更新了站号选择功能,并且自动搜索波特率。 2、增加了串口通讯调试功能,可以自己发送字符研究PLC解密,无需输入站号和校验码,直接点击发送即可。 3、修复了部分USB转232通讯速率较低,而跳过密码的现象。此软件是专门用于破解台达的4位无错误次数保护的密码的。可以区分大小写,可以勾选不同的字符,这样解密速度就快多了,一般字母与数字组合的几小时搞定。 4、最近增加了直读功能,当然只能直读早期的老版本PLC,最新版本的只能穷举。 使用窍门:此次升级重点是支持485通讯,无论用编程口还是用485通讯口都可以正常通讯。所以提高效率的方法就来了,您可以同时使用两个通讯口解密,时间缩短一半,事半功倍。 如果您的电脑没有两个COM口,这也没有关系,加一个USB-COM口即可。再不然也可以用两台电脑同时解密。 经我测试:编程口解密速度远远大于485通讯口。所以解密重点放在编程口上。相同的时间设置,485口解密要比编程口整整慢了一半。 如果出现连接错误,说明通讯波特率非出厂设置,您只需把PLC置于编程状态即可。 智能软件:如果您的PLC设置了密码错误次数保护,此软件是不运行的。解密前有提示告诉你加密方式和级别,绝对不因为输入错误次数过多而锁机保护,软件初始通讯就做各种检测,包括型号检测,加密方式检测,是否还有8位的 PLC识别码 保护等等。 文件解密:采用 WPL Soft 2.42 版测试完成,支持WPL Soft 2.41 WPL Soft 2.40,至于低版本的未经测试,情况不明。不过低于2.40版本的文件可以用此版本编程软件打开,然后另存为***即可破解。所经过测试的型号见下图,保证下图中的型号都可以破解,并且全部测试正常。那么多的型号一看就晕了,其实只有四种文件,细心的人们发现的,你看看下图中文件的大小,基本就四种类型,至今为止还没有发现第五种,谁有发现立刻告诉我,给予更新。

16,472

社区成员

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

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

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