单片机学习小组
直播中

刘丽

7年用户 1261经验值
私信 关注

收发函数封装是什么样的?

收发函数封装是什么样的?

回帖(1)

李开心

2022-1-27 11:19:32

首先用到uart口肯定要操作相应的寄存器初始化对应要使用的uart。这里重点不讲这个,初始化见最底下的示例。
下面介绍收发函数封装。(一些变量可能是全局变量,请自行在函数外定义)
一、发送字符函数
函数原型:void send_char(char s)
参数说明:s是需要发送的字符数据,类型是字符类型,大小=8bit
功能:发送一个字符类型数据到uart的数据缓冲器(txrrxrn),即串口发送一个字符
源码:
void send_char(char s)
{
    _txr_rxr0 =s;
    while(_tidle0 == 0 );
}
二、发送字符串函数
函数原型:void send_buff(char *s)
参数说明:s是需要发送的字符数据,类型是字符串类型(或者说字符数组),大小=8bit*n(n是整数)
功能:发送一串字符类型数据到uart的数据缓冲器(txrrxrn),即串口发送一个字符串
源码:
void send_buff(char *s)
{
    while(*s)
    {
        send_char(*s);
        s++;
    }   
}
三、接收字符数据函数
函数原型:int re_buff(char *rbuff,char c)
参数说明:*rbuff是接收字符数据指针,指向接收的字符串;c是接收终止标志符,直到遇到该标志符停止接收(可设置为‘’即自动接收完所有字符)
返回值:该次接收完数据后字符串的长度值即len或未接收完字符串时(字符数组的长度+1)的值即data_count
功能:接收uart口接收到的字符数据
源码:
int re_buff(char *rbuff,char c)
{ char rdata;
    while(_ridle0 == 0); //等待接收完成
    rdata =_txr_rxr0;
    if(rdata!=c)
    {
        rbuff[data_count]=rdata;
        data_count++;
    }     
     else
     {
         rbuff[data_count]='';
         len=data_count;
            data_count=0;
            return len;
     }
    return data_count;
}下面是我自己写的一个例子:
/*******************************/
功能:本程序完整,用于调试合泰芯片uart功能
实验现象:串口调试助手发送数据xxx,回显xxx及其长度
第一次测试时间:2019年5月24号下午
单片机型号:HT66F2390
/*******************************/
#include "HT66F2390.h"   
  int data_count=0;    //数据长度
  int len;
void Delayms(unsigned long del)
{    unsigned long i;                                        //@fSYS=8MH,延遲del*1ms
    for(i=0;i
}
void uart_init()
{
    _pas1 = _pas1 | 0b11110000;
    _u0cr1 = 0b10000000;
    _u0cr2 = 0b11101100;
    _ur0e = 1;
     _brg0 = 103;  //波特率 4800
    _mf5e = 1;
    _emi =1;
}
void send_char(char s)
{
    _txr_rxr0 =s;
    while(_tidle0 == 0 );
}
void send_buff(char *s)
{
    while(*s)
    {
        send_char(*s);
        s++;
    }   
}
int re_buff(char *rbuff,char c)
{ char rdata;
    while(_ridle0 == 0); //等待接收完成
    rdata =_txr_rxr0;
    if(rdata!=c)
    {
        rbuff[data_count]=rdata;
        data_count++;
    }     
     else
     {
         rbuff[data_count]='';
         len=data_count;
            data_count=0;
            return len;
     }
    return data_count;
}
void main()
{
    _wdtc = 0b10101111;
    uart_init();
    while(!_hircf);
    while(1);
}
DEFINE_ISR(UART0,0x3C)
{
    char buff[100];
    int buff_length;
        buff_length=re_buff(buff,'n')+48;  //长度大于9会显示乱码的长度值,原因就是ASCII转换
        if(data_count==0)
{
        send_buff(buff);  
       send_char( buff_length);
    _ur0f = 0;  //清除标志
}
举报

更多回帖

×
20
完善资料,
赚取积分