‘壹’ 51单片机串口收发程序
11,单片串口的收发程序镇甘城子应该也是比较不错的证件,能够真诚地使用所有认为这个属相应该比较广一点儿也不所以我认为这跟屏幕放大。
‘贰’ 51单片机串口通信是全双工的,但是为什么又说它的发送和接受不可以同时进行呢
51单片机串口通信是全双工的,发送和接受可以同时进行。不可以同时进行的是半双工。
全双工方式分别由两根不同的传输线传送数据时,通信双方都能在同一时刻进行发送和接收操作,通信系统的每一端都设置了发送器和接收器,因此,能控制数据同时在发送和接受两个方向上传送。
半双工使用同一根传输线既作接收又作发送,虽然数据可以在两个方向上传送,但通信双方不能同时收发数据。采用半双工方式时,通信系统每一端的发送器和接收器,通过收/发开关转接到通信线上,进行方向的切换,因此,会产生时间延迟。收/发开关实际上是由软件控制的电子开关。
(2)单片机串口收发扩展阅读:
全双工方式在发送设备的发送方和接收设备的接收方之间采取点到点的连接,这意味着在全双工的传送方式下,可以得到更高的数据传输速度。
全双工方式无需进行方向的切换,因此,没有切换操作所产生的时间延迟,这对那些不能有时间延误的交互式应用(例如远程监测和控制系统)十分有利。这种方式要求通讯双方均有发送器和接收器,同时,需要2根数据线传送数据信号。
‘叁’ 编程实现stm32单片机串口的数据收发
int main(void)
{
u16 t;
u16 len;
u16 times=0;
delay_init(); //延时函数初始化
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
uart_init(115200); //串口初始化为115200
LED_Init(); //LED端口初始化
KEY_Init(); //初始化与按键连接的硬件接口
while(1)
{
if(USART_RX_STA&0x8000)
{
len=USART_RX_STA&0x3fff;//得到此次接收到的数据长度
printf("\r\n您发送的消息为:\r\n\r\n");
for(t=0;t<len;t++)
{
USART_SendData(USART1, USART_RX_BUF[t]);//向串口1发送数据
while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待发送结束
}
printf("\r\n\r\n");//插入换行
USART_RX_STA=0;
}
}
}
‘肆’ 编写单片机串口收发数据的完整程序(C语言编写)
我用的新唐芯片,8051内核,跟51差不多,望采纳
void UART_Initial (void)
{
P02_Quasi_Mode; //Setting UART pin as Quasi mode for transmit
P16_Quasi_Mode; //Setting UART pin as Quasi mode for transmit
SCON_1 = 0x50; //UART1 Mode1,REN_1=1,TI_1=1
T3CON = 0x08; //T3PS2=0,T3PS1=0,T3PS0=0(Prescale=1), UART1 in MODE 1
clr_BRCK;
RH3 = HIBYTE(65536 - (1000000/u32Baudrate)-1); /*16 MHz */
RL3 = LOBYTE(65536 - (1000000/u32Baudrate)-1); /*16 MHz */
set_TR3; //Trigger Timer3
}
以上是初始化的
void Send_Data_To_UART1(UINT8 c)
{
TI_1 = 0;
SBUF_1 = c;
while(TI_1==0);
}
这个是发送
void UART_isr (void) interrupt 4 //串行中断服务程序
{
if (RI_1==1)
{ /* if reception occur */
clr_RI_1; /* clear reception flag for next reception */
Receive_Date[c] = SBUF_1;
if (Receive_Date[0] == First_Date)
{
c++;
}
else if(Receive_Date_Size > 0 && Receive_Date_Size < 4)
{
c++;
}
else if(Receive_Date[c] == Last_Date && Receive_Date_Size ==4)
{
c = 0;
Flag_Receive_One = 1;
}
else
{
c = 0;
}
}
}
接收
‘伍’ 单片机串口收发中,用printf和用sbuf的区别在哪里
sbuf 是51单片机中的串口数据寄存器,接收和发送用的都是它(实际是两个寄存器),
而printf是C语言的库函数,它可以通过串口和并口输出数据,若用串口输出数据,需重新定位fput c()函数,printf调用fput c()函数,fput c()函数调用串口发送命令,最终是操作sbuf 这个寄存器
‘陆’ 51单片机通过串口实现数据的发送与接收程序
串口收发,要有通信协议。也就是什么时候开始接收,接收到指令后,转发什么数据。这个要知道,才可以写。而且使用不同的51单片机,其内部寄存器配置是不同的。
一般来说,过程如下:
1,配置串口参数、波特率等,开启串口中断;
void Init_UART()
{
}
2,中断函数里写中断响应函数,根据接收的指令或者数据,执行相应的动作;
程序一般为:
void UART_ISR() interrupt x using y
{
;串口中断处理函数
}
x - 单片机的C51中断号
y - 指定使用的当前工作寄存器组号(0-3 PSW中的RS0,RS1组合)
3,主程序
int main(void)
{
Init_UART();
while(1)
{
;//数据发送函数
}
}
‘柒’ 关于单片机串口同时收发数据的时序问题
回答这些问题之前,你要先复习一下串口部件的结构和数据收发的原理。
1.不管你有没有处理RI,还是在继续接收数据的。数据接收完成之后,数据从移位寄存器转移到数据寄存器中,这时才产生中断,但移位寄存器是空的,还可以继续接收数据。
2.你想让串口的收和发同时工作,那就只能使用中断方式,你用查询方式是不可能的。如果是使用“半双工”,那就简单些:A查询方法发送数据,B以查询方式接收数据,反之依然,这样的缺点是比较耗时,没有实时性。
后面的几个问题就用2来回答了,就是用中断的方法来接收和发送数据,这样不管你是不是同时收发的,都能处理。按照你的例子说,上位机要发送命令来查询下位机的结果,那简单,下位机必须要一个缓冲区来保存收到的数据,然后在主程序中处理缓冲区中的内容,再根据情况向上位机发送数据。当然下位机的发送也可以使用缓冲区来保存待发送的数据。
使用缓冲区的好处就是能保证不发送遗漏。比如上位机可以一次发送多个命令给下位机,这样就是在接收缓冲区中形成命令队列,即“排队”,下位机逐一处理队列中的每一条命令,然后将对应结果送入发送缓冲区中“排队”,再有串口发送中断逐一将其中的字节发送出去。
‘捌’ 单片机串口通信,串口助手调试收发都正常,接到一块就不正常了
每片单片机单独与串口助手通信成功。说明你的2个单片机串口通信都很正常,
但2个单片机合在一起就通信不成功,发送、接受不到数据!很可能是以下原因:
1)仔细检查2片单片机的脚,rx
tx
交叉接且要共地。
2)串口助手通信是采用中断接收触发信号的,反应迅速且准确,你单片机也可采用外部中断作触发,用定时器来读取数据,一般比较迅速准确。
3)你可以发送0x55
或
0xaa,这样的值来确定接收数据是否会正常。
如果还是不行,你用示波器监视下,看看数据发送口是否有数据传送?
‘玖’ 单片机接收串口数据
你通过串口助手要接受字符串或一组数据需要在单片机端开辟一个缓冲区,否则可能丢失数据。
以下程序是较为通用的串口收发例程,开辟一个16字节的缓冲区,两个指针,一个存数指针,一个取数指针,两指针相等,证明没有新的接收数据。
#include<reg51.h>
#define uchar unsigned char
uchar buf[16],getptr,putptr;
void uart_isr() interrupt 4
{
if(RI)
{
RI=0;
buf[putptr]=SBUF;
putptr++;
putptr&=0x0f;
}
}
main()
{
TMOD=0x20;
SCON=0x50;
TH1=TL1=0xfd;
TR1=1;
ES=1;
EA=1;
putptr=0;
getptr=0;
while(1)
{
if(getptr!=putptr) //取数指针和存数指针如果不等
{
SBUF=buf[getptr];
getptr++;
getptr&=0x0f;
while(!TI);
TI=0;
}
}
}
‘拾’ 关于单片机串口发送和接收问题:连续发送过来的数据如何接收
不会的了
设备与设备之间要有一定的通信协议才能有良好的通信过程
比较明显的就是要配置一样的波特率
如用9600的波特率
那代表1S发送9600位也就是9600/8=1200个字节
也就是1S/1200约为1MS左右的时间发送字节
单片机处理速度都是微秒级别的
在接收到第一个字节后完全有时间处理再接收
不过时间不能太长
另外串口接收用中断接收比较保险
中断程序中只做存储数据很简单的判断
接收完整后再处理所有的数据