好文档 - 专业文书写作范文服务资料分享网站

单片机与PC机串口通讯设计

天下 分享 时间: 加入收藏 我要投稿 点赞

if(UART1_RX_BUF[nRX1_Len_temp ++]== 0) //就是否到达停止位 {

nRX1_Len = nRX1_Len_temp;

nRev_UART1 = 1; //设置标志来通知主程序

nRX1_Len_temp = 0;

URCTL1 |=URXWIE; //数据收完改变为地址方式 } }

对于接收中断,程序处于等待状态,当外面有数据到来时则触发接收,进入接收中断服务程序,当地址验证正确开始后面得数据,中断从“RxBUF1”寄存器里读取数据,将读到得数据放到“UART1_RX_BUF[ ]”全局缓冲区里,在接收数据之后设置一个标志“nRev_UART1”来通知主程序,完成后等待下一中断得到来。接收中断服务程序包含了对地址位就是否匹配得验证。 2、发送中断服务程序

当主程序有数据要发送时,设置一个中断标志进入中断并发送数据。下面为程序代码:

interrupt [UART1TX_VECTOR] void UART1_TX_ISR(void) {

if(nTX1_Len != 0) {

nTX1_Flag = 0;

// 表示缓冲区里得数据没有发送完

TXBUF1==0x01; //先写入地址字符 TXBUF1 = UART1_TX_BUF[nSend_TX1]; //开始传输数据 nSend_TX1 += 1;

if(nSend_TX1 >= nTX1_Len) //数据就是否发送完 {

nSend_TX1 = 0; nTX1_Len = 0;

nTX1_Flag = 1; //缓冲区里没有数据要发送了 }

}

}

对于发送中断,程序一般处于禁止等待状态。只有当单片机得发送缓冲区历由数据需要发送,并将发送中断置为允许方式后,发送中断才开始工作。发送时从缓冲区里发送数据,遵守通讯协议:首先发送地址位,然后发送需要传输得数据,最后发送校验以及结束标志。在发送中断服务程序里从“UART1_TX_BUF[ ]”全局缓冲区里取出数据给“TXBUF1”寄存器进行发送,发送完后发送中断服务程序等待下一中断得到来。

以上两程序可以瞧出采用中断有很好得结构,只要在中断服务程序里理接收与发送数据,然后与主程序进行数据交换,易实现多任务操作,很好利用单片机资源。 五、主处理程序

主处理程序包含初始化、设置串口工作方式、对接收到得数据进行处理以及封装需要发送得数据。下面就是它得程序代码。

#include #include \、h\//定义串口操作变量 char nRev_UART1;

// 串口 1 得接收标志

char UART1_TX_BUF[60]; // 串口 1 得发送缓冲区 char UART1_RX_BUF[60]; int nTX1_Len; char nRX1_Len; char nRX1_Len_temp; char nTX1_Flag; int nSend_TX1; void main(void) {

int nRes_UART1; int nRes = 0;

char UART1_RX_Temp[60]; int i; int n;

// 串口 1 得接收缓冲区

WDTCTL = WDTPW + WDTHOLD; // 关闭瞧门狗

_DINT(); // 关闭中断 Init_CLK(); // 初始化时钟 Init_Port(); // 初始化端口 Init_UART1(); // 初始化串口1

_EINT(); // 打开中断 for(;;) // 进入处理循环 {

if(nRev_UART1 == 1) //如果有接收中断

{

nRev_UART1 = 0;

for(i = 0;i < nRX1_Len;i++)

UART1_RX_Temp[i] = UART1_RX_BUF[i]; // 将接收到得

数据拷贝到临时缓冲区。

nRes = ProcessCMD(UART1_RX_Temp,nRX1_Len); switch(nRes) { case 1:

UART1_TX_BUF[0] = 'O';

UART1_TX_BUF[1] = 'K'; UART1_TX_BUF[2] = 13; nTX1_Len = 3;

// 设置中断标志,进入发送中断程序 IFG2 |= UTXIFG1;

nRX1_Len = 0;

break;

case 2:

for(n = 0;n < nRX1_Len;n++)

UART1_TX_BUF[n] = UART1_RX_Temp[n];

UART1_TX_BUF[nRX1_Len] = 'O'; UART1_TX_BUF[nRX1_Len+1] = 'K';

UART1_TX_BUF[nRX1_Len+2] = 13; nTX1_Len = nRX1_Len + 3;

// 设置中断标志,进入发送中断程序 IFG2 |= UTXIFG1;

nRX1_Len = 0;

break;

case -1:

UART1_TX_BUF[0] = 'E';

UART1_TX_BUF[1] = 'R';

UART1_TX_BUF[2] = 'R';

UART1_TX_BUF[3] = 'O';

UART1_TX_BUF[4] = 'R';

UART1_TX_BUF[5] = 13; nTX1_Len = 6;

// 设置中断标志,进入发送中断程序 IFG2 |= UTXIFG1;

} }

}

nRX1_Len = 0; }

break;

在上面得程序中主要根据“ProcessCMD(UART1_RX_Temp,nRX1_Len)”对得到得结果进行处理,向PC发送响应数据,如果接收到得数据有错误,则发送“ERROR”。数据封装完成后,设置“nTx1_Len”得长度,并通过“IFG2 |= UTXIFG1;”发送中断,从而使中断处理程序进行数据发送、上面程序中“ProcessCMD(UART1_RX_Temp,nRX1_Len)”主要处理接收到得数据并返回相应得代码以使主程序处理。该函数得具体代码为:

int ProcessCMD(char pBuf[],int nLen) {

int nTemp = -1;

int i;

if(nLen <= 2) return -1; if (nLen == 5) { }

return nTemp; }

3、2、2 上位机(PC机)程序设计 一、上位机串口通讯编程方法得选择

随着Windows在国内得普及,越来越多得微机用户转向了Windows操作系统,所以在DOS环境下利用汇编语言与C语言对串口通信得编程方式已经不再被瞧好。在Windows操作系统下利用VC++6、0开发平台对串口通信上位机编程,其软件界面非常方便友好,编程工作量相对较小,只需进行主要应用功能得编程与少量界面控制得编程[12]。

在Windows环境下,利用PC机串口进行通信得常用方法有以下几种:一就是利用Windows API通信函数;二就是利用VC得标准通信函数_inp、_inpw、_inpd、_outp、_outpw、_outpd等直接对串口进行操作;三就是使用Microsoft Visual C++得通信控件(MSComm);四就是利用第三方编写得通信类[13]。本设计将介绍用PComm开发PC机与单片机得通信程序得解决方案。 二、Pcomm主要命令码

PComm( Professional Comm Tool for PC) 串口通信软件包专门运用Windows NT/2000/XP。如今WindowsNT/2000/XP 已被广泛应用, 而它提供得Win32Comm API 却复杂难用, 而且没有提供如Zmodem 等高阶应用函数, 这增加了通信软件工程师得负担。针对这种状况, MOXA开发了一套简单易用得程式函数库及功能强大得辅助工具—PComm。PComm Pro支持多种编程语

if((pBuf[0] == 'A') && (pBuf[1] == 'T')

&& (pBuf[2] == 'E') && (pBuf[3] == '0')) nTemp = 1;

if((pBuf[0] == 'A') && (pBuf[1] == 'T')

&& (pBuf[2] == 'E') && (pBuf[3] == '1')) nTemp = 2;

单片机与PC机串口通讯设计

if(UART1_RX_BUF[nRX1_Len_temp++]==0)//就是否到达停止位{nRX1_Len=nRX1_Len_temp;nRev_UART1=1;//设置标志来通知主程序nRX1_Len_temp=0;URCTL1|=UR
推荐度:
点击下载文档文档为doc格式
4epa89getd02tjb2ixwe3xy6q955i0014rc
领取福利

微信扫码领取福利

微信扫码分享