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
// 串口 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机串口通讯设计
![](/skin/haowen/images/icon_star.png)
![](/skin/haowen/images/icon_star.png)
![](/skin/haowen/images/icon_star.png)
![](/skin/haowen/images/icon_star.png)