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));*/
}
}
}