WIN10系统下与AT89C52单片机的串口通讯

作者:北京诺伟软件科技有限公司正高级工程师  王林峰

此系列是本人长期软件数控系统开发实践的总结,希望能对大家有帮助)

随着windows系统在大众的普及,WinXP及以上Win10操作系统逐渐占去主导地位。一些原先在单片机上进行的简单的单液晶显示及小面板操作的设备逐渐要进行改造、升级,充分利用Windows系统的人机界面优势,以及单片机的NC控制优势,两者结合,给用户耳目一新的感觉,不论在操作上,还是数据处理上效率都大大地提高。笔者此前曾做了这样一个改造工作,用IPC工控机替换原来的负责界面管理的单片机系统,而之前的负责控制的单片机硬件、软件不做改变。与大家分享一下。

1、系统改造后的硬件结构

下位机使用古老的AT89C52芯片,AT89C52是一个低电压,高性能CMOS 8位单片机,片内含8k bytes的可反复擦写的Flash只读程序存储器和256 bytes的随机存取数据存储器(RAM),器件采用ATMEL公司的高密度、非易失性存储技术生产,兼容标准MCS-51指令系统,片内置通用8位中央处理器和Flash存储单元,外接18.432mhz晶振。


微信图片_20200314082701.jpg


上位机采用IPC,主频2.4Ghz的2GB 赛扬4核4线程DOC GPU设计的高性能工业级PC104单板。提供4个RS232串口。

(注:老的上位机也是一个单片机)

两者之间通过10米长的带屏蔽的9芯电缆线连接。

2、软件实现的方法

2.1老式的双单片机系统数据传输

充分利用发送数据的第9位RB8、TB8作为命令、数据的区分,即当第9位为1时是命令字节,为0时是数据字节,每一帧数据的发送格式如下格式如下;

命令(TB8为1) + 数据1 +数据2 +数据3 (数据1/2/3 TB8为0)

或者单字节的请求接收命令:

命令(TB8为1)

下位机为主,负责定时发送数据及错误信息,同时请求接收人机界面的相关命令。

2.2改造后,上位机为IPC,WIN 10操作系统,下位机不变

由于在win 10下的串口通讯提供如下位:

波特率,数据位,开始位,停止位,校验位。

他们都无法真正地当第9位使用。所以,改进通讯的方法是,把windows作为主发送、请求方,单片机部分只负责接收及按照请求命令发数据即可。单片机部分不使用第9位,也不使用校验。

至于windows的编程,使用VC++工具即可。用一下的标准读写即可:

::WriteFile(hComm, pbytes, nbytes, &nb, &oWrite)

::ReadFile(hComm, pbytes, nbytes, &nb, &oRead)

我自己写了一个通讯类MySerialPort,处理了超时、异常错误等。通过::GetOverlappedResult(hComm, &oRead, &nb, FALSE)检查发送、接收的实际个数。

3、软件开发要点及问题解决

3.1定时处理

以上的软件实现方法,带来的问题是,如何保证通讯的正确性。在windwos下,无法像单片机那样,用UART中断的方式进行数据的接收处理。用一般的定时器中断,很容易在换页面时停止,从而影响系统的运行,引起死机。为此,使用SetMultimediaTimer定时器,分辨率m_Resolution为10ms:

::timeSetEvent(m_Interval, m_Resolution, m_Timerproc, m_UserData, fuEvent);

设置定时间隔m_Interval即可。用示波器跟踪,可看出每两帧的数据间隔非常稳定,保证100ms/帧数据的传输频率。

每一帧内的命令、数据发送,也必须用准确的延时,不能随意些用for循环代替。

3.2 波特率问题

还有一个问题,容易忽略。那就是串行口传输的BAUDRATE波特率。在此使用比较高的速度,0.1152Mb/s。速度高,也容易导致死机。

由于单片机与IPC 的windows系统频率的差异,计算出来的BAUDRATE也是有差异的,这就导致有的通讯系统,在长时间工作后,通讯出现偏差。通过比较,单片机采用18.432MHZ,计算的波特率比较准确。

4、结论:

通过波特率、定时器的调整,最终达到准确无误通讯的目的。在连续1000小时的连续系统通讯工作考核中,准确率达到100%,保证了系统的正常交付。Windows10串口通讯,要达到改造老的单片机的人机界面部分,并正常运行,方法是可行的。

用特高速的IPC(2.4Ghz4核的64位机)与特低速的单片机(18Mhz的8位机)进行通讯处理,可以很容易地改造老的系统,保持原系统的控制部分的硬件、软件不改变。以很小的代价达到了升级换代的目的,界面交互也变得很友好。