51单片机串口同时发送文本和数据

51单片机串口同时发送文本和数据,第1张

你看一下send-string这个函数,string指的是字符串,要求输入的参数应该是指针类型,可以输入数组名称,也可以直接输入一串字符如"I love you"用引号引住,发送的是ASCI码

要想发数据,你可以写一个发数据的函数,或者将数据变量转换为地址,

如 uchar a=0x38 想发a的数值可以 send-string(&a)

接收端如果是十六进制格式就会显示十进制56或0x38

如果是文本模式就显示8

发一连串数据 a[4]={1,2,3,4}

send-string(a)即可

当然你可以同时发字符串和数据,先将数据转换为字符串(数组),然后用字符串拼接函数把原来的字符串和数据字符串合成一个数组,再一次发过去

接收端只能以一种方式接收了,要么文夲,要么十六进制

uchar

idata

SystemBuf[10];

//用于接收

uchar

Rx=0;

//

接收数据

条数

uchar

code

AT[]="YES,IT

IS";

void

UART_init

(void)

{

TMOD=0x20;

//用定时器1

PCON=0x00;

//

波特率

不加倍

SCON=0x50;

//串行方式1

TH1=0xFD;

//9600

TL1=0xFD;

//

EA=1;

//

ES=1;

//

TR1

=1;

}

void

sendchar(uchar

ch)

//串口送一个字节

{

SBUF=ch;

while(TI==0);

TI=0;

}

void

sendstring(uchar

p)

//送字符串

{

while(p)

{

sendchar(p);

p++;

}

}

///////

void

receive(void)

interrupt

4

using

1

//中断

{

if(RI)

{

if(Rx<10)

//这儿最多收10个字节

{

SystemBuf[Rx]=SBUF;

Rx++;

}

RI=0;

}

}

///

void

main()

{

uchar

i;

UART_init();

while(1)

{

if(SystemBuf=='S')

{

sendstring(AT);

for(i=0;i<10;i++)

//接收清0

{

SystemBuf[i]=0;

}

Rx=0;

}

}

}

//////////如有小错误,自己调下,手打的,大小写可能不正常,这是标准程序,直接用,

程序采用了查询式发送,for(i=0;i<6;i++) {SendChar(askconfig[i]); },共发送了6个字符。

再去查询收到否。

这种方法,就是有问题的,发送6个字符时,就可能收到了好几个字符,而没有及时保存,完全可能丢失信息。

应该采用中断方式接收;发送,也可以用查询,也可以用中断。

方法弄清楚了,程序就容易编写、调试了。

avr单片机的缓冲区串口收发,别的单片机 你改一下寄存器就行

//芯片:mega16

#include

#define F 8000000

#define BAUD 9600

#define u8 unsigned char

#define u16 unsigned int

#define u32 unsigned long

void usart_init(void);

char get_char(void);

void put_char(char c);

#define RX_SIZE 20

#define TX_SIZE 20

char rx[RX_SIZE];

u8 rx_head,rx_rear,rx_overflow;

char tx[TX_SIZE];

u8 tx_head,tx_rear,tx_overflow;

int main(void)

{

usart_init();

put_char( 'a' );

put_char( 'b' );

put_char( 'c' );

put_char( 'd' );

put_char( 'e' );

while(1)

put_char(get_char());

}

void usart_init(void)

{

UCSRB = (1<<RXCIE)|(1<<TXCIE)|(1<<RXEN)|(1<<TXEN);//接收结束中断使能,发送结束中断使能,接收允许,发送允许

UCSRC = 0X86; //选择UCSRC,异步模式,无校验,1位停止位,8位数据位

UBRRH = (F/16/BAUD - 1)>>8; //选择UBRRH,设置波特率

UBRRL = (unsigned char)(F/16/BAUD - 1);

rx_head = 0;

rx_rear = 0;

rx_overflow = 0;

tx_head = 0;

tx_rear = 0;

tx_overflow = 0;

asm("sei");

}

char get_char(void)

{

char c;

while(rx_head == rx_rear);//如果接收缓冲区空,则一直等待

c = rx[rx_head++]; //从头取数据,头+1

if(rx_head >= RX_SIZE ) rx_head = 0;//若头超出缓冲区末端,移至缓冲区开端

return c;

}

void put_char(char c)

{

if(tx_head != tx_rear || !( UCSRA&(1<<UDRE) ) )//若 发送缓冲区非空 或 发送寄存器非空

{

tx[tx_rear++] = c;//将c移至缓冲区尾,尾+1

if(tx_rear >= TX_SIZE ) tx_rear = 0;//若尾超出缓冲区末端,移至缓冲区开端

if(tx_rear == tx_head)//若尾前进到头,说明缓冲区满

{

tx_overflow = 1;//缓冲区溢出 (事实上刚好不溢出,这里为了编程方便,牺牲一个字节并记为溢出)

tx_head++;//牺牲最早接收的那个字节

}

}

else

UDR = c;//直接发送

}

#pragma vector = USART_RXC_vect

__interrupt void receive(void)

{

rx[rx_rear++] = UDR;

if(rx_rear >= RX_SIZE ) rx_rear = 0;//若尾超出缓冲区末端,移至缓冲区开端

if(rx_rear == rx_head)//若尾前进到头,说明缓冲区满

{

rx_overflow = 1;//缓冲区溢出 (事实上刚好不溢出,这里为了编程方便,牺牲一个字节并记为溢出)

rx_head++;//牺牲最早接收的那个字节

}

}

#pragma vector = USART_TXC_vect

__interrupt void transmit(void)

{

if(tx_head != tx_rear)//如果发送缓冲区非空

{

UDR = tx[tx_head++];//发送头数据,头+1

if(tx_head >= TX_SIZE) tx_head = 0;//若头超出缓冲区末端,移至缓冲区开端

}

}

以上就是关于51单片机串口同时发送文本和数据全部的内容,包括:51单片机串口同时发送文本和数据、用单片机串口向电脑串口调试助手发送一个字符串,用C语言编程、51单片机串口发送数据等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9313014.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-27
下一篇 2023-04-27

发表评论

登录后才能评论

评论列表(0条)

保存