你看一下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单片机串口发送数据等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)