UART通信应用举例(uart可以与多少个uart通信)
单片机里面的uart是提供什么用的?
一般是芯片对芯片通讯使用的通信接口。比如,某款GPS模块的标准接口是3.3VUART的,则可以直接用3.3V电平线进行互连通信。这样可以节约成本、提高效率,一般应用于板载设备之间的通讯。
UART相对于RS232和485通讯来说,简化了电平转换的中间步骤,但通讯距离和抗干扰能力都不如RS232和485。
举例:一个是直接通信,一个是间接通信以保证传输距离和抗干扰指标
RS232通讯:A芯片的UART接口(3.3V)==RS232接口芯片(12V)==标准串行通讯电缆==RS232接口芯片(12V)==B芯片的UART接口(3.3V)
UART通讯:A芯片的UART接口(3.3V)==排线==B芯片的UART接口(3.3V)
51单片机与uart通信
//51串口通信基本设置我不讲了,网上泛滥得很,基本通信调通的基础上通过命令来控制单片机动作可以用以下的方法,很简单。
//串口中断处理,接收用数组RecCmd[],调试助手每次发送数据的最后两个字符是'\r'和'\n'
//接收一个命令完成后将接收的内容放入缓冲RecCmdBuf[]
extern uchar idata RecCmd[10],RecCmdBuf[10]; //串口接收双缓冲,最大接收9个有效字节,第10个是’\r‘
extern bit RecCmdFlag;
void ISR_SERIAL(void) interrupt 4 using 2
{
uchar i;
if(RI) //RI接受中断标志
{
RI = 0; //清除RI接受中断标志
i = SBUF; //SUBF接受/发送缓冲器
SBUF= i; //RecCmd[RecPtr]; Echo Back
unReadyToSend = 1; //与另一个非echo发送程序之间的互锁信号
if('\n' == i) //收到‘\n'字符表示调试助手已经发送完成
{
i = 0;
while(('\r' != (RecCmdBuf[i] = RecCmd[i])) i10)
{
i++; //已接收部分放入缓冲
}
if(i) //避免调试助手发空内容,即只发'\r'和'\n'
RecCmdFlag =1; //通知主程序命令接收完成
RecPtr = 0; //准备接收新命令
}
else
{
RecCmd[RecPtr++] = i;
if(RecPtr9)
RecPtr = 0; //超长无效命令
}
}
if(TI)
{
TI = 0; //发送中断响应
unReadyToSend = 0;
}
}
//命令处理部分可以放在主循环里调用,命令判断的方式非常原始,但自己测试用就无所谓
void SerialCmdHandle(void)
{
if(RecCmdFlag)
{
if('m' == RecCmdBuf[0] 'e' == RecCmdBuf[1] 'n' == RecCmdBuf[2] 'u' == RecCmdBuf[3] '\r' == RecCmdBuf[4])
ShowMenu(); //command "menu"
if('s' == RecCmdBuf[0] 'h' == RecCmdBuf[1] 'o' == RecCmdBuf[2] 'w' == RecCmdBuf[3] ' ' == RecCmdBuf[4] 's' == RecCmdBuf[5] '\r' == RecCmdBuf[6])
{
LedShow = Serial; //command "show s"
}
if('s' == RecCmdBuf[0] 'h' == RecCmdBuf[1] 'o' == RecCmdBuf[2] 'w' == RecCmdBuf[3] ' ' == RecCmdBuf[4] 'a' == RecCmdBuf[5] 'd' == RecCmdBuf[6] '\r' == RecCmdBuf[7])
{
LedShow = Adc; //command "show ad"
}
if('s' == RecCmdBuf[0] 'h' == RecCmdBuf[1] 'o' == RecCmdBuf[2] 'w' == RecCmdBuf[3] ' ' == RecCmdBuf[4] 't' == RecCmdBuf[5] 'e' == RecCmdBuf[6] '\r' == RecCmdBuf[7])
{
LedShow = TempCov; //command "show te"
}
if('s' == RecCmdBuf[0] 'h' == RecCmdBuf[1] 'o' == RecCmdBuf[2] 'w' == RecCmdBuf[3] ' ' == RecCmdBuf[4] 't' == RecCmdBuf[5] 'i' == RecCmdBuf[6] '\r' == RecCmdBuf[7])
{
LedShow = Time; //command "show ti"
}
if('s' == RecCmdBuf[0] 'h' == RecCmdBuf[1] 'o' == RecCmdBuf[2] 'w' == RecCmdBuf[3] ' ' == RecCmdBuf[4] 't' == RecCmdBuf[5] 'd' == RecCmdBuf[6] '\r' == RecCmdBuf[7])
{
LedShow = Date; //command "show td"
}
if('s' == RecCmdBuf[0] 't' == RecCmdBuf[1] ' ' == RecCmdBuf[2] '\r' == RecCmdBuf[9])
{
//command "st 000012" 改变ds1302的时间 ss:mm:hh //24hour |0x80
SetClockTime((((RecCmdBuf[3]-'0')4) | (RecCmdBuf[4]-'0')),(((RecCmdBuf[5]-'0')4) | (RecCmdBuf[6]-'0')),(((RecCmdBuf[7]-'0')4) | (RecCmdBuf[8]-'0')));
}
if('s' == RecCmdBuf[0] 'd' == RecCmdBuf[1] ' ' == RecCmdBuf[2] '\r' == RecCmdBuf[9])
{
//command "sd 011299"改变ds1302的日期 dd:mm:yy
SetClockDate((((RecCmdBuf[3]-'0')4) | (RecCmdBuf[4]-'0')),(((RecCmdBuf[5]-'0')4) | (RecCmdBuf[6]-'0')),(((RecCmdBuf[7]-'0')4) | (RecCmdBuf[8]-'0')));
}
LedChangeFlag = 1;
//LcdChangeByteFlag = 0 + CHANGE + SERIAL;
RecCmdFlag = 0;
}
}
//下面是一个串口输出的menu菜单,给你参考。
void SendOneByte(uchar ch)
{
//ES = 0; //禁止发送中断
SBUF = ch;
unReadyToSend = 1; //互锁信号
}
void UartSendST(uchar *st, uchar len)
{
while(len 0)
{
while(unReadyToSend);
SendOneByte(*st++);
len--;
}
}
typedef struct _menu{
uchar *item;
uchar size;
} T_Menu;
T_Menu code MAINM = {"MENU\r\n",6}, \
MENU0 = {"_____________________________________\r\n",39}, \
MENU1 = {"menu- list this menu\r\n",23}, \
MENU2 = {"show s/ad/te/ti/td- \r\n",19}, \
MENU3 = {"serial/ad-da/temp/time/date\r\n",29}, \
MENU4 = {"led f num- led flash time us\r\n",31}, \
MENU5 = {"st ssmmhh-set time\r\n",21}, \
MENU6 = {"sd ddmmyy-set date\r\n",21}, \
MENU7 = {"\r\n",2}, \
MENU8 = {"\r\n",2};
void ShowMenu(void)
{
UartSendST(MAINM.item,MAINM.size);
UartSendST(MENU0.item,MENU0.size);
UartSendST(MENU1.item,MENU1.size);
UartSendST(MENU2.item,MENU2.size);
UartSendST(MENU3.item,MENU3.size);
UartSendST(MENU4.item,MENU4.size);
UartSendST(MENU5.item,MENU5.size);
UartSendST(MENU6.item,MENU6.size);
UartSendST(MENU7.item,MENU7.size);
UartSendST(MENU8.item,MENU8.size);
}
UART的用途是什么?
UART是一种通用串行数据总线,用于异步通信。该总线双向通信,可以实现全双工传输和接收。在嵌入式设计中,UART用来与PC进行通信,包括与监控调试器和其它器件,如EEPROM通信。