单片机监控程序的结构与应用系统的应用系统

在调试单片机应用系统时,需要反复地修改用户程序,为了避免频繁地使用编程器写存储芯片,可以编制单片机监控程序,单片机的监控程序接收来自PC机的用户程序,PC机向单片机发送用户程序。3单片机监控程序的实现现在PC机的应用程序绝大多数都是基于Win98,在进行串行通信时可以通过调用API函数来实现。

在调试单片机应用系统时,需要反复修改用户程序。 为了避免频繁使用编程器写入存储芯片,可以编写一个单片机监控程序。 单片机的监控程序接收来自PC机的用户程序,PC机将用户程序发送给单片机。 。

2 用户程序格式

用户汇编微控制器源程序(.asm 文件)以形成它。 十六进制格式的文件,是发送给单片机的十六进制可执行文件。 文件的结构为:由多行组成,行头是起始符(:),然后是该行有效数据字节数(行满时为10,即16位小数) ),后面是两个字的段地址和00,后面是有效数据,行尾是校验码和换行符。 为了简化单片机监控程序,只发送行字节数和有效数据给单片机,可以使用以下简单的C语句。 从十六进制文件中提取字节数和有效数据:

fscanf(fp,":%2x%4×00",&TranBytes,&地址);

fscanf(fp,"%2x",&TranChar);

3 单片机监控程序的实现

单片机监控程序实现的功能是从PC机接收用户程序,将用户程序放置在用户程序段中,当接收到用户程序时,跳转到用户程序段首地址执行用户程序程序。 接收采用单字节模式,即一次只接收一个字节。

为了保证单片机接收用户程序的准确性,在接收用户程序之前需要进行一次握手。 笔者使用的握手协议是:PC发送0x55,单片机接收0x55并将0x55发送回PC。 主机PC接收0x55,然后发送0xaa。 微控制器接收0xaa并将其发回。 PC收到0xaa后,握手成功,握手成功。 发送用户程序,单片机切换为接收用户程序。

为了防止单片机监控程序被破坏,需要将其固化在EPROM中。 笔者使用的80C196系统固化了地址2000H-7FFFFH,监控程序从2080开始。这就涉及到如何使用中断向量的问题。 可以这样解决:将8000以后的地址放入中断向量地址中。 例如,将8030H放入串行中断向量地址中。 当要使用串行中断时,将PUSHF和LJMP指令放在8030中,并将它们放在8032中。要跳转到的字节数。

使用串行中断,微控制器逐行接收用户程序(参见上面提到的hex文件的结构)。 首先接收该行要接收的字节数,然后将接收到的有效数据写入用户程序段。 当接收到的有效数据数等于本行要接收的字节数时,准备接收下一行,以此类推。 ,如果某一行要接收的字节数为0,则表示用户程序已经传输完毕。 将用户程序段首地址压入堆栈,然后弹出(改变中断返回地址技术),执行用户程序,如图1所示。

4 Win98平台上串口通信的实现

目前的PC应用程序大多基于Win98,通过调用API函数即可实现串口通信。 API函数提供对串口的各种操作。 串口通信是通过CreateFile、GetCommState、SetCommState、WriteFile、ReadFile、CloseHandle以及超时函数GetCommTimeouts和SetCommTimeouts来实现的。 使用CreateFile函数打开串口并获取串口句柄。 CloseHandle 关闭串口句柄。 使用 GetComm-State 和 SetCommState 设置通信参数。 WriteFile和ReadFile可以读写串口。 在TC环境下,操作串口有两种方式:查询方式和中断方式。 在VC环境中,操作串口的方式有很多种:查询方式、同步I/O方式、异步I/O方式、事件驱动I/O方式。 作者采用异步I/O模式,允许串口操作在后台执行。 留出足够的时间在后台执行读写串行端口操作。 当使用异步I/O模式时,使用以下方法打开串口:

HANDLE m_hCom=CreateFile("COM2", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL);

FILE_FLAG_OVERLAPPED表示串口是异步打开的。 这时可以在WriteFile和ReadFile的最后一个参数中分别指定一个OVERLAPPED结构体,如下所示:

OVERLAPPED m_OverlappedWrite,

m_OverLappedRead;

m_OverlappedWrite。 hEvent=CreateEvent(NULL, TRUE, FALSE, NULL);

m_OverlappedRead。 hEvent=CreateEvent(NULL, TRUE, FALSE, NULL);

CreateEvent 函数创建一个命名或未命名的事件对象。 第一个参数是机密属性并设置为 NULL。 第二个参数为TRUE,表示ResetEvent函数用于将事件设置为无信号。 如果为FALSE,则会等待一个事件的线程被释放后,系统自动将其设置为无信号。 第三个参数将事件设置为初始无信号,第四个参数将事件名称设置为NULL。 在读写操作中使用事件:

WriteFile(m_hCom, &WriteBuffer, nByteToWrite, &nByteWritten, &m_OverlappedWrite)

ReadFile(m_hCom, &ReadBuffer, nByteToRead, &nByteRead, &m_OverlappedRead)

当WriteFile接管m_OverlappedWrite的控制权时。 hEvent没有信号。 读操作完成后,m_OverlappedWrite。 hEvent 变为信令状态,类似地完成写操作。 使用ReadFile和WriteFile读写串口时,需要注意的是,这两个函数是立即返回函数,即该函数可能在实际读写操作完成之前就返回,操作会转入的背景。 但这并不表明实际操作失败。 如果返回的错误码为ERROR_IO_PENDING(通过调用GetLastError获得),则说明读写操作仍在进行中。 目前,该事件尚未发出信号。 为了明确限制前台等待操作的时间,可以通过调用GetTickCount和GetTickCount进行延迟处理。 ()函数获取当前系统时间,类似于C中的biostime()函数。可以通过调用GetOverlappedResult获取后台运行状态。 该函数报告最近一次 OVERLAPPED 操作的结果。 函数原型如下:

BOOLGetOverlappedResult(

HANDLHFile, //文件句柄

LPOVERLAPPEDlp重叠,

//OVERLAPPED结构指针

LPDWORD lpNumberOfBytesTransferred,

//实际完成的字节数

BOOLb等待

//等待标志);

进行串口读写时,hFile为串口句柄,lpOverlapped为函数等待的事件,lpNumberOfBytesTransferrd为实际读写的字节数。 当bWait为TRUE时,函数等待读写操作完成并返回。 bWait 为 FALSE。 该函数立即返回。 以上两个函数的使用请参考以下程序代码:

if (!WriteFile(m_hCom, &WriteBuffer, nByteToWrite, &nByteWritten, &m_OverlappedWrite)) {

if (GetLastError()==ERROR_IO_PENDING)

{

结束时间=GetTickCount()+1000; //延迟1000毫秒

while(!GetOverlappedResult(m_hCom,&m_OverlappedWrite&nByteWritten,FALSE))

{

if(GetTickCount()>结束时间)break;

if(nByteWritten)

//处理读取到的字节

对函数 ReadFile 的调用可以类似地处理。 延时处理后,可以等到读写操作完成后再执行后续程序。 为了方便应用,您可以通过调用API函数,编写自己的串口操作类库来完成实际需求。

5 结论

本文介绍的单片机监控程序和串行通信方法简单、易于实现、程序运行稳定。

参考

1王健,孙凯凯,张书涵。 MCS-96系列单片机原理及应用技术。 武昌:华中科技大学出版社,1999

2彼得·诺顿,罗布·麦格雷戈。 MFC 开发Windows95/NT4 应用程序。 北京:清华大学出版社,1998

3.谭浩强. C 编程。 北京:清华大学出版社,1998

单片机

单片机实习报告范文篇-7月19下午理工楼多媒体室单片机开发系统演示

2024-5-11 14:05:20

单片机

开发人员Marcin设法使RaspberryPi4ModelB上运行Windows10ARM

2024-5-11 15:08:05

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索