您的位置 首页 汽车

PC机与下位单片机异步串行通讯

在由一台PC机(上位机)和多台单片机(下位机)构成的分布式控制系统中,单片机主要负责实时数据采集,并将初步处理后的数据通过串行口传…

在由一台PC机(上位机)和多台单片机(下位机)构成的分布式操控体系中,单片机首要担任实时数据并重,并将开端处理后的数据经过串行口传送给PC机以便由PC机串行口的指令对单片机进行操控,一起经过打印机或显示器向用户随时供给各种计算报表和整个操控进程的详细数据。在这样的分布式操控体系中,单片机与微机之间的多路通讯是整个体系的要害,本文将介绍在进步通讯的准确性、牢靠性和功率的前提下,用PComm开发PC机与单片机的通讯程序的处理计划。

1 通讯协议
为了确保牢靠的通讯,有必要有一套完善的通讯协议。分布式操控体系中的每台单片机均有仅有的编号。通讯开端时,先由PC机呼叫被叫单片机的编号,单片机在接纳到微机的呼叫后,首要判别是不是自己的编号,如果是,则发送呼叫应对信号,不然不予理睬。微机在接纳到呼叫应对信号之后,将向单片机宣布通讯指令字符串。以下是上位PC机协议的格局:
单片机号 单片机号 指令码 指令码 中止标志  
其间,单片机号代表现场第几台单片机,占用1个字节,发送两次的意图是为了避免搅扰;指令码则代表上位机向下位机发布的作业指令,它也占用1个字节,发送两次的意图也是为了避免搅扰。而中止标志则标明一次指令发送结束。运用时可依据该标志判别上位机的指令是否发送结束。
下位机协议格局如下:
数据块 校验位
该格局中,数据块为下位机上传到上位PC机的数据。校验位则用于PC机对收到的数据进行奇偶校验(占1个字节)。校验正确后,可将数据写入内存,不然宣布数据传输过错信息,以要求单片机从头传输数据。
其他,作为一个完好的通讯协议,只要上述约好还不行,还有必要在发送和接纳数据的时刻间隔上加以约束。不然,很可能我们某些原因而形成无约束的等候对方应对,使整个体系处于作业不正常状况,或许延误其它动作的处理。详细时刻约束可依据通讯内容、CPU处理速度,再加上恰当的余量来确认。

2 单片机通讯程序规划

规划单片机通讯程序时,有必要充分发挥单片机的功率。我们单片机多应用于实时性较强的操控场合,因而,应将及时响应和操控目标的动作放在优先考虑的方位,以尽量削减通讯等辅助性操作所占用的CPU时刻。依据上述考虑,笔者在规划单片机通讯程序时,将通讯程序分为接纳中止处理程序、发送中止处理程序和通讯处理程序3部分,并将这3部分程序奇妙地进行组合,然后构成整个单片机的通讯程序。
2.1 接纳中止处理程序
接纳中止处理程序首要担任接纳微机发送到单片机接纳缓冲区(不对数据进行处理,以削减中止占用的时刻)的数据,当接纳到规则的字符数或在必定等候时刻内无后续数据之后,置接纳结束标志,以标明接纳缓冲区中有待处理的数据并恳求通讯处理程序对其进行处理。其流程图如图1所示。
2.2 发送中止处理程序
发送中止处理程序首要担任向微机发送数据,发送中止一般处于制止状况,只要在通讯处理程序将需求发送的数据写入单片机的发送缓冲区,并将发送中止置为答应办法后,发送中止才开端作业,并将缓冲区数据逐个发送给微机。当发送完指定长度的数据后(发送缓冲区为空),发送中止处理程序将发送中止置为制止(封闭)状况,直到通讯处理程序将其再一次敞开。其流程如图2所示。
2.3 通讯处理程序
考虑到尽量削减通讯中止程序所占用的CPU时刻,通讯处理程序被放在一般主循环中调用。只要在接纳到上位机送来的一串数据,且接纳结束标志为“ON”时,才干真实进行处理,不然不进行处理。这样就可运用送信后等候微机答复的时刻进行其他处理,然后消除了空等候时刻,进步了CPU的运用率。通讯处理程序可依据通讯处理状况的不同来别离碑文不同的途径。在进入相应途径后,首要对接纳缓冲区的内容进行正确性查看,查看正确后再依据通讯要求或协议规则对缓冲区的内容进行处理(包含内存的写入和读出),一起从头组织数据到发送缓冲区以向微机发送数据,最终退出通讯处理程序以碑文其它的程序。待接纳中止程序从头接纳到数据并将接纳完标志置为“ON”后,可从头进入通讯处理程序进行处理。

3 PC机通讯程序规划

在VC++6.0环境下,运用PC机串口进行通讯的常用办法有两种榜首是调用Windows APIAppli- cation Program Interface函数;第二是运用ActiveX的MSComm控件。榜首种办法需声明及调用许多API函数,非常烦琐。而第二种办法是将API函数封装起来,这种办法虽较为简洁,但不能分量杂乱情况下的通讯要求。本文将介绍其他一种用PComm处理PC机的串口通讯办法。
PComm是一种用于处理多进程/多线程的串口通讯软件开发工具,它供给了许多依据API函数的指令集来处理串口通讯,可以在Visual C++、Visual Basic、Delphi 5.0等多种开发工具下运用,且具有传输速度快、运用灵敏便利等特色,可以分量杂乱情况下的串口通讯要求。
3.1 Pcomm的首要指令码
PComm的首要指令码有以下几种:
● sio open(port);
用于设置并翻开串口,其间port的1、2、3、4别离代表COM1、COM2、COM3、COM4。当返回值为0时,一共串口现已翻开,不然为串口翻开犯错。
● sio close(port);
封闭串口,当返回值为0时,一共串口现已封闭,不然为串口封闭犯错。
● sio ioctl(portbaudmode);
用于设置串口波特率、校验位、数据位、中止位等参数。
● sio getch();
从串口输入缓冲区读出一个字符,返回值为0一共已收到数据。
● sio-read(portbuflen);
用于从串口输入缓冲区读出一串字符,buf代表字符串数组len代表数组长度,返回值为0一共未收到字符,大于0代表收到字符的个数。
● sio-SetReadTimeoutsportTotalTimeouts(Inter-valTimeouts);
在设定的等候时刻内连续读串口输入缓冲区,TotalTimeouts代表设定的等候时刻,IntervalTimeouts代表每次读出的间隔时刻。
● sio-flush(portfunc);
用于清空缓冲区。当func为0时清空输入缓冲区,为1时清空输出缓冲区,为2时清空输入输出缓冲区。
● sio-putch(portterm);
用于向串口缓冲区发送一个字符,返回值为0时一共发送正确,不然一共发送过错。
● sio-write(portbuflen);
用于从串口缓冲区发送一串字符,buf代表字符串数组,len代表数组长度。
3.2 完成进程
在用Pcomm处理PC机的串口通讯时,其完成进程如下:
(1)发动VC++ 6.0,新建一个依据对话框的应用程序TxRx。一起增加静态文本、编辑框和按钮控件,并为它们增加相应的变量。其特点见表1。

表1 TxRx应用程序的特点

控 件 ID 变量名 类 型
按 钮 IDC_TRSMITT 发送按钮  
Edit IDC_TXDATA M_TxData Cstring
Edit IDC_RXDATA M_RxData Cstring
(2) 将Pcomm.h和Pcomm.lib参加到工程中,并在TxRxDlg.cpp文件中参加#include “Pcomm.h”头文件,尔后便可调用其供给的通讯指令集。
(3)在TxRxDlg.cpp文件中增加有关程序代码,也就是在OnInitiDialog函数中的TODO查办后参加以下代码:
//TODO Add extra initialization here
int retport=1
ret=sio openport //翻开串口1
sio DTRport0 //置DTR为低电平
sio ioctlportB19200P NONE|BIT 8| STOP 1 //设置波特率为19200,8位数据位,
1位中止位,无校验位。
3.3 数据通讯
下面举例说明PC机怎么经过串口向单片机发送并接纳数据。
void CTXRXDlgSendRecv//收发数据子函数
{
while1
{
int ret1
sio flushport2;//清空串口输入输出缓冲区
sio- write(port,1,5);
向串口缓冲区发送5个字符
sio- SetReadTimeouts(port,40,1);
//在40ms内每隔1ms读一次串口
ret1=sio-read(port,RecvBuf,1);
if (ret1>0)
{
sio- close(port);
break;
}
//若收到数据,封闭串口,跳出循环
else;
//若未收到数据,对串口再一次发数据并再次查询接纳。
}
}
4 结束语
本文给出了分布式操控体系中上位PC机与下位单片机之间进行异步串行通讯的处理计划。此计划在实践运转进程中,运转安稳,通讯功能杰出,然后较好地处理了上位机与下位机之间的通讯问题。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/qiche/263638.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部