我觉得这里有两个问题,首先你得SCON配置为0x20,这样事实上你选择的串口工作方式是方式0通过移位寄存器发送和接收数据,而这种工作方式是不能像你在程序里这样直接传递数据的,最好是再看一看器件数据手册,把工作方式调整为方式1,第二个问题就是你用定时器配置好波特率发生器后,根本就没有启动,需要把寄存器TCON里面TR1位置1才能开始工作
看一下uart通信
具体过程:
1设置好uart控制寄存器,自己定义收发缓冲区,以及收发函数,一个两个串口无所谓
2写好中断向量表,自己查查一下uart0,uart2,uart2的中断号,例如
void __irq IRQ_Handler(void)
{
switch(INTOFFSET)
{
case 28: //INT_UART0
Uart0_Int();
break;
case 23: //INT_UART1
Uart1_Int();
break;
case 15: //INT_UART2
Uart2_Int();
break;
}
}
3用公母线将arm与pc相连,打开pc的超级中断,将arm与pc的比特率设置为相同的就可以了。
你用的是AVR单片机吧,这种单片机里面是没有串口接收FIFO的,所以每次只能是接收一个字节数据,否则接收寄存器就溢出了,想接收多个字节指令,就需要你把每次接到的数据一次次串起来,在程序里组装这些数据然后存储
……你自己把逻辑锁死了。收到一回4字节序列后,flag1置位,之后发送数据。可是在发送数据的时候又会进入中断的,由于接收缓冲区中还是那4字节的序列,于是flag1再次被置位……于是乎进入永不停歇的死循环。
你的串口中断应当判断一下是发送还是接收……
先说发送
第一个字节是地址没问题,理论上是不是发送下一字节要根据回应的ACK来决定,但实际实现的时候是直接发送的而不理会其ACK,每发送一个8比特,你要间隔1个比特位供从机向总线上写ACK,然后你再写第二字节数据,同样,空出ACK,然后给出结束位
接收
结构是一样的,地址位要变成读 *** 作,区别在于中间的ACK要由你,主机给出,你给低表示还要继续读,你既然要读两个字节,中间的ACK就要给低,接收完两个数据,你给出高电平,告诉从机你已经不需要读取了,然后你给总线结束位就完事了
以上就是关于UART一般怎么使用(422、485协议芯片)全部的内容,包括:UART一般怎么使用(422、485协议芯片)、求大神帮忙写个ATmega8的UART模块程序,串口调试助手发送信号,并且单片机再发送回来。、PC机与单片机之间的串口通信的程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)