实验内容:微控制器接收上位机数据,接收完成后,将接收到的数据原样送回上位机
实验目的:进一步熟悉UART的应用。
感受:此部分内容还有很大一部分没有搞清楚,其中还牵扯到C语言的基础知识,以及串口通讯间速率匹配的问题。
#include "main.h"
void UARTInit(void)
{
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);//使能外设A端口R/T
SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0); //使能串口外设
GPIOPinTypeUART(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1); //使能串口GPIO脚
//UART配置 UART0 串口时钟为系统时钟 波特率9600 8位数据位 1位停止位 无奇偶校验
UARTConfigSetExpClk(UART0_BASE, SysCtlClockGet(), 9600,(UART_CONFIG_WLEN_8 | UART_CONFIG_STOP_ONE |UART_CONFIG_PAR_NONE));
//UARTFifoLevelSet(UART0_BASE,8,8);//FIFO出发深度
IntEnable(INT_UART0); //使能串口中断
IntMasterEnable(); //使能全局中断
//UARTIntEnable(UART0_BASE,UART_INT_RX | UART_INT_TX);//使能串口接收和发送中断
//IntPrioritySet(INT_UART0,0);//设置中断优先级
UARTEnable(UART0_BASE); //使能串口(uart0) 发送和接收
}
//接收上位机数据
unsigned int i=0;
//全局变量的数组必须给定其大小,否则的话系统将不会给其分配存储空间
unsigned char s[32];
void UARTReceive(void)
{
while(UARTCharsAvail(UART0_BASE))
{
s[i++]=UARTCharGetNonBlocking(UART0_BASE);
}
}
void UARTSend(const unsigned char *str,unsigned long ulcount)
{
while(*str!='\0')
{
if(UARTSpaceAvail(UART0_BASE))
{
UARTCharPutNonBlocking(UART0_BASE, *str);
//成功发送则返回true;若FIFO中没有可用空间则返回False,稍后再次尝试。P212
str++;
ulcount--;
}
}
i=0;
}
/*************************************************
**本代码实现的功能为接收上位机数据后原样送回上位机
*************************************************/
void main(void)
{
Bsp_Init();//其内包含JTAG保护和系统时钟配置代码
UARTInit();
while(1)
{
UARTReceive();
SysCtlDelay(SysCtlClockGet()); //延时1S
unsigned long count=strlen(s);
UARTSend(s,count);
}
}
//调试之初,在While(1)的死循环中,实现收发。串口调试器设为1S自动发送,
//发现收到的数据有间隔,且无规则,后来怀疑是收发速度不匹配的问题,
//随在接收数据函数后加1S钟延时函数,此时发现串口调试器收到的数据仍然是杂乱的
//几经周折后将自动发送去掉,改为手动发送,随出现了预期的结果。
//之后考虑不是自动发送的问题,可能是发送频率过高所致,遂将发送周期改为3000Ms
//此时亦可达到预期效果
//师兄点睛:全局变量的数组定义时必须给定其大小,否则的话系统将不会给其分配存储空间
//后来将全局的数组去掉其大小,发现能收预期数据,但在预期数据后有一堆乱码。