怎样用模拟串口uart发送字符串

1、首先用sprintf格式化字符串,还可以添加可能需要一系列的附加参数,每个参数包含了一个要被插入的值,替换了 format 参数中指定的每个 % 标签。。然后用模拟串口发送。
2、例如:

void gnss_app_output_nmea(char *nmea_buffer){
    int32_t checksum = 0;
    char temp_buffer[MNL_SERVICE_MAX_DATA_LEN] = {0};
    checksum = gnss_app_get_command_checksum((int8_t*)nmea_buffer, strlen(nmea_buffer));
    sprintf(temp_buffer,
        "$%s*%02X\r\n",
        nmea_buffer,
        (int)checksum);

    gnss_io_send_data_by_user(GNSS_IO_FLAG_OUT_NMEA, (uint8_t *)temp_buffer, strlen(temp_buffer), true);
}

上面例子就是在nmea_buffer字符串中增加变量checksum值,然后变成temp_buffer,然后发送出来。

3、模拟串口例子:



/* Includes ------------------------------------------------------------------*/
#include <stdint.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
/* Kernel includes. */
#include "FreeRTOS.h"
#include "task.h"
#include "task_def.h"
#include "hal_gpio.h"
#include "hal_gpio_internal.h"
#include "semphr.h"

/* hal includes */
#include "hal.h"
#include "sys_init.h"
#include "syslog.h"
#include "memory_map.h"
#include "atci_adapter.h"

#include "uart2_main.h"

static uint32_t uart2_tx_handle;
static struct uart2data uart2_tx_data;         //要发送数据的临时缓存
static unsigned char uart2_tx_status = 0;      //当前是否处于发送状态
volatile static unsigned char uart2_tx_bit_status = 0;

//static volatile struct uart2data uart2_rx_data;         //要接收数据的临时缓存
static unsigned char uart2_rx_status = 0;      //当前是否处于接收状态
static unsigned char uart2_rx_bit_status = 0;
volatile unsigned char uart2_rx_complete_flag = 0;

char uart2_rx_datae[100];
unsigned char uart2_rx_data_leng;

static SemaphoreHandle_t uart2_tx_xSemaphore;


static void gpio_test(void)
{
     unsigned int i,j;

     hal_gpio_set_output(HAL_GPIO_9, HAL_GPIO_DATA_HIGH);
            
     for(i=0;i<245;i++)
     {}
       
     hal_gpio_set_output(HAL_GPIO_9, HAL_GPIO_DATA_LOW);
     
     for(j=0;j<245;j++)
     {}
}

void gpt_uart2_tx_callback(void)
{
    static unsigned int data_num = 0;
    static unsigned char bit_num = 0;
     static char temp;

    //hal_gpio_toggle_pin(HAL_GPIO_10);
    switch(uart2_tx_bit_status)
    {
        case Uart2_tx_start_bit:
            gpio_base->GPIO_DOUT.CLR[0] = (GPIO_REG_ONE_BIT_SET_CLR << 10);
            uart2_tx_bit_status = Uart2_tx_data_bit;
            temp = uart2_tx_data.uart2_data[data_num];
           // log_send("start_");
            break;
            
        case Uart2_tx_data_bit:
            if(temp & 0x01 == 1)
            {
                gpio_base->GPIO_DOUT.SET[0] = (GPIO_REG_ONE_BIT_SET_CLR << 10);
            }
            else
            {
                gpio_base->GPIO_DOUT.CLR[0] = (GPIO_REG_ONE_BIT_SET_CLR << 10);
            }
            temp = (temp >> 1);
            bit_num ++;
            if(bit_num == 8)
            {
                bit_num = 0;
                uart2_tx_bit_status = Uart2_tx_stop_bit;
            }
             //log_send("data_");
            break;
        
        case Uart2_tx_stop_bit:
            gpio_base->GPIO_DOUT.SET[0] = (GPIO_REG_ONE_BIT_SET_CLR << 10);
            uart2_tx_bit_status = Uart2_tx_start_bit;
            data_num++;
            if(data_num == uart2_tx_data.uart2_data_num)
            {
                hal_gpt_stop_timer(HAL_GPT_Uart2_Tx_PORT);
                data_num = 0;
                uart2_tx_status = Uart2_tx_normal;    
            }
            break;
            
        default:
            uart2_tx_bit_status = Uart2_tx_start_bit;
            data_num = 0;
            break;
    }     
}

void gpt_uart2_rx_callback(void)
{
    static unsigned int data_num = 0;
    static unsigned char bit_num = 0;
    volatile static char temp;
    unsigned char i;

    switch(uart2_rx_bit_status)
    {
        case Uart2_rx_start_bit:
            uart2_rx_bit_status = Uart2_rx_data_bit;      //从产生中断callback到start第一次要130us 后面都是  94us
           
            break;
            
        case Uart2_rx_data_bit:
             //gpio_base->GPIO_DOUT.SET[0] = (GPIO_REG_ONE_BIT_SET_CLR << 10);    //进入ent中断到这里195、199,后面161、160、173、164、158、157、169、163
            if (gpio_base->GPIO_DIN.R[0] & (GPIO_REG_ONE_BIT_SET_CLR << 9))   //  high
             {

               temp |= (1 << bit_num);
 
               //gpio_base->GPIO_DOUT.CLR[0] = (GPIO_REG_ONE_BIT_SET_CLR << 10);   //这个看起来比较准
             }
             else                                                            //low
             {

               temp &= (~(1 << bit_num));
 
               //gpio_base->GPIO_DOUT.SET[0] = (GPIO_REG_ONE_BIT_SET_CLR << 10);
             }
             bit_num ++;
             if(bit_num == 8)
             {
                 bit_num = 0;
                 uart2_rx_bit_status = Uart2_rx_stop_bit;
             } 
             
            break;
        
        case Uart2_rx_stop_bit:
            
            uart2_rx_datae[data_num] = temp;
            
            data_num++;
            uart2_rx_data_leng = data_num;
            temp = 0;
            uart2_rx_bit_status = Uart2_rx_detector_bit;           

            break;

        case Uart2_rx_detector_bit:
            if (gpio_base->GPIO_DIN.R[0] & (GPIO_REG_ONE_BIT_SET_CLR << 9)) 
             {
             
                 //gpio_base->GPIO_DOUT.CLR[0] = (GPIO_REG_ONE_BIT_SET_CLR << 10);
                 data_num = 0;
                 uart2_rx_complete_flag = 1;
                 hal_gpt_stop_timer(HAL_GPT_Uart2_Rx_PORT);
                 uart2_rx_pin_it_mode_init();
                 //gpio_base->GPIO_DOUT.SET[0] = (GPIO_REG_ONE_BIT_SET_CLR << 10);    //进入到pin设置为it159、163、156、154、158      首次181、175

             }
             else 
             {
                 uart2_rx_bit_status = Uart2_rx_data_bit;

             }

            break;
            
        default:
            //log_send("rx_error");
            break;

    }

}

void gpt_uart2_rx_int_callback(void *user_data)
{

    //gpio_base->GPIO_DOUT.CLR[0] = (GPIO_REG_ONE_BIT_SET_CLR << 10);

    hal_eint_mask(HAL_EINT_NUMBER_9);   
    //log_send("int_callback");
    
    uart2_rx_pin_io_mode_init();
    uart2_rx_bit_status = Uart2_rx_data_bit;

    hal_gpt_start_timer_us(HAL_GPT_Uart2_Rx_PORT,Uart2_Rx_bit_time,HAL_GPT_TIMER_TYPE_REPEAT);   
    //gpio_base->GPIO_DOUT.SET[0] = (GPIO_REG_ONE_BIT_SET_CLR << 10);      //进入中断到初始化定时器完成要47        、45、49、60、53、44、50首次72、71
    hal_eint_unmask(HAL_EINT_NUMBER_9);
}



 void log_send(unsigned char *buf)
{
    unsigned char buf_num;
    unsigned char i   ;
    buf_num = strlen(buf);
    for(i=0;i<buf_num;i++)
    {
        hal_uart_put_char(HAL_UART_0,buf[i]);
    }
}

int fputc(int ch, FILE *f)
{ 
    //USART_SendData(USART1, (uint8_t) ch);
    //while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
    uart2_send_data(&ch,1);
    return (ch);
}

void uart2_send_string(char *str)
{
    
    uart2_send_data(str,strlen(str));
    //atci_mem_free(buf);

}

void uart2_send_data(char *data, unsigned int data_long)
{
   //unsigned char k;
   // hal_uart_put_char(HAL_UART_0,data_long);
   //log_send("uart2");

    if((uart2_tx_status == Uart2_tx_normal) && (data_long > 0))  
    {   
        //log_send("send");
        //xSemaphoreTake(uart2_tx_xSemaphore, portMAX_DELAY);
        uart2_tx_status = Uart2_tx_busy;
        uart2_tx_data.uart2_data = data;
        uart2_tx_data.uart2_data_num = data_long;

        uart2_tx_bit_status = Uart2_tx_start_bit;

        hal_gpt_start_timer_us(HAL_GPT_Uart2_Tx_PORT,Uart2_Tx_bit_time,HAL_GPT_TIMER_TYPE_REPEAT);   
        /*while(1)
        {
            if(uart2_tx_status == Uart2_tx_normal)
                break;
        }*/

    }  
    
}

static void uart2_rx_pin_io_mode_init(void)
{
    
    hal_gpio_init(HAL_GPIO_9);                //uart2 rx
    hal_pinmux_set_function(HAL_GPIO_9, HAL_GPIO_9_GPIO9); 
    hal_gpio_set_direction(HAL_GPIO_9, HAL_GPIO_DIRECTION_INPUT);
    //hal_gpio_set_output(HAL_GPIO_9, HAL_GPIO_DATA_HIGH);
}

static void uart2_rx_pin_it_mode_init(void)
{

    hal_eint_config_t uart2_rx_config;

    hal_gpio_init(HAL_GPIO_9);                //uart2 rx
    hal_pinmux_set_function(HAL_GPIO_9, HAL_GPIO_9_EINT9); 
    //hal_gpio_set_direction(HAL_GPIO_9,HAL_GPIO_DIRECTION_INPUT);
    //hal_gpio_pull_up(HAL_GPIO_9);
    hal_eint_mask(HAL_EINT_NUMBER_9);

    uart2_rx_config.debounce_time = 0;
    uart2_rx_config.trigger_mode = HAL_EINT_EDGE_FALLING;

    hal_eint_init(HAL_EINT_NUMBER_9,&uart2_rx_config);
    hal_eint_register_callback(HAL_EINT_NUMBER_9,gpt_uart2_rx_int_callback,NULL);

    hal_eint_unmask(HAL_EINT_NUMBER_9);

}

void uart2_pin_init(void)
{   
    uart2_rx_pin_it_mode_init();
  
    if(hal_gpt_init(HAL_GPT_Uart2_Rx_PORT)== HAL_GPT_STATUS_OK)      //9
    {
        hal_gpt_register_callback(HAL_GPT_Uart2_Rx_PORT,gpt_uart2_rx_callback,NULL);
        //hal_gpt_start_timer_us(HAL_GPT_Uart2_Rx_PORT,1000000,HAL_GPT_TIMER_TYPE_REPEAT);
    }
    else
    {
        hal_gpt_stop_timer(HAL_GPT_Uart2_Rx_PORT);
        hal_gpt_deinit(HAL_GPT_Uart2_Rx_PORT);
    }


    hal_gpio_init(HAL_GPIO_10);                 //Uart2 tx
    hal_pinmux_set_function(HAL_GPIO_10, HAL_GPIO_10_GPIO10); 
    hal_gpio_set_direction(HAL_GPIO_10, HAL_GPIO_DIRECTION_OUTPUT);
    hal_gpio_set_output(HAL_GPIO_10, HAL_GPIO_DATA_HIGH);

    if(hal_gpt_init(HAL_GPT_Uart2_Tx_PORT)== HAL_GPT_STATUS_OK)     //10
    {
        //log_send("init_ok_");
        hal_gpt_register_callback(HAL_GPT_Uart2_Tx_PORT,gpt_uart2_tx_callback,NULL);
        // hal_gpt_start_timer_us(HAL_GPT_Uart2_Tx_PORT,Uart2_Tx_bit_time,HAL_GPT_TIMER_TYPE_REPEAT);
    }
    else
    {
        hal_gpt_stop_timer(HAL_GPT_Uart2_Tx_PORT);
        hal_gpt_deinit(HAL_GPT_Uart2_Tx_PORT);
    }

}

void gpt_uart2_rx_callback_test(void)
{
    uart2_send_data("simcom.com", 10);
}


void gpt_uart2_tx_callback_test(void)
{
    
}

void uart2_processing(void)
{
    unsigned char sendbuf[512];
    unsigned int i = 0;
    unsigned int k = 0;
    unsigned char j = 0;
    char *test_buf ="leiting test";


    //log_send("task_enter_");
    
    uart2_pin_init();


    while(1)
    {

      if(uart2_rx_complete_flag == 1)
      {
          uart2_rx_complete_flag = 0;

          for(k=0;k<uart2_rx_data_leng;k++)
          {
              hal_uart_put_char(HAL_UART_0,uart2_rx_datae[k]);
          }

          
          uart2_send_data(uart2_rx_datae, uart2_rx_data_leng);

          /*for(i=0;i<sizeof(sendbuf);i++)
          {
              sendbuf[i] = j;
              j++;
          }
          uart2_send_data(sendbuf,sizeof(sendbuf));*/

      }
    }
}







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值