串口透传程序python_基于ESP32的全功能(uart+mqtt+TCP/IP)透传实现

目的:更廉价的物联网仪器解决方案。

当前方案:配置串口安卓平板。

-优势:开发简单,安卓一大把人,好维护。操作人员熟悉操作方式。学习成本低。

-劣势:成本巨高,推广困难。仪器必须预留平板位置。

ESP方案:Bluff配网+Mqtt+tcp/IP+uart

-优势:真便宜啊。占地更小,尤其小仪器。

-劣势:找人很费劲,尤其小团队。用的还不是stm。

实现方式:糅合和官方各种案例,包括,blufi,uart publish,mqtt,socks等样例。(码农原来是这个样子,抄过来整合一下。。)

以下代码是老板亲自糅合的,自己现学现用。代码规范啥的,大家多多给指点以下。一定及时修改更新。以下代码方案完全给大家贡献出来。

PASS:我这边传递的都是stm直接使用的串口指令。所以都是十六进制的BYTE字符串。所以如果有用到传递其他字符串的。需要各位手动修改。代码太多了,就贴重点了。具体代码大家私信我要。人多的话,我再考虑上传git,毕竟有点献丑。。

1.首先:串口接收。

static void uart_event_task(void *pvParameters)

...

uart_event_t event;

size_t buffered_size;

uint8_t* dtmp = (uint8_t*) malloc(RD_BUF_SIZE);

char *hexstr_data = malloc(RX_BUF_SIZE);

BLUFI_INFO("for uart event loop begin:");

for(;;)

{

//Waiting for UART event.

if(xQueueReceive(uart_queue, (void * )&event, (portTickType)portMAX_DELAY))

{

bzero(dtmp, RD_BUF_SIZE);

ESP_LOGI(TAG, "uart[%d] event:", EX_UART_NUM);

switch(event.type) {

//Event of UART receving data

/*We'd better handler data event fast, there would be much more data events than

other types of events. If we take too much time on data event, the queue might

be full.*/

case UART_DATA:

ESP_LOGI(TAG, "[UART DATA]: %d", event.size);

const int rxBytes = uart_read_bytes(EX_UART_NUM, dtmp, event.size, portMAX_DELAY);

//send to mqtt server

if (rxBytes > 0 && mqtt_is_connected ) {

dtmp[rxBytes] = 0;

ESP_LOGW(TAG, "Read %d bytes: '%s'", rxBytes, dtmp);

esp_log_buffer_hex("Receive Data", dtmp, rxBytes);

int cir_len= sizeof(*dtmp) / sizeof(dtmp[0]);

ESP_LOGI(TAG, "recv data lenth is:%d\n",cir_len);

if ( cir_len > 1 ){

byte_str_hex(dtmp,hexstr_data,cir_len);

// BLUFI_INFO("event publish data is:%s\n",hexstr_data);

if(tcp_socked){

tcp_tx_data = hexstr_data;

}else{

int msg_id = mqtt_send_data(TOPIC_UART,hexstr_data);

ESP_LOGI(TAG, "sent publish successful, msg_id=%d\n", msg_id);

}

}

}

ESP_LOGI(TAG, "[DATA EVT]:");

uart_write_bytes(EX_UART_NUM, (const char*) dtmp, event.size);

break;

//Event of HW FIFO overflow detected

case UART_FIFO_OVF:

ESP_LOGI(TAG, "hw fifo overflow");

// If fifo overflow happened, you should consider adding flow control for your application.

// The ISR has already reset the rx FIFO,

// As an example, we directly flush the rx buffer here in order to read more data.

uart_flush_input(EX_UART_NUM);

xQueueReset(uart_queue);

break;

//Event of UART ring buffer full

case UART_BUFFER_FULL:

ESP_LOGI(TAG, "ring buffer full");

// If buffer full happened, you should consider encreasing your buffer size

// As an example, we directly flush the rx buffer here in order to read more data.

uart_flush_input(EX_UART_NUM);

xQueueReset(uart_queue);

break;

//Event of UART RX break detected

case UART_BREAK:

ESP_LOGI(TAG, "uart rx break");

break;

//Event of UART parity check error

case UART_PARITY_ERR:

ESP_LOGI(TAG, "uart parity error");

break;

//Event of UART frame error

case UART_FRAME_ERR:

ESP_LOGI(TAG, "uart frame error");

break;

//UART_PATTERN_DET

case UART_PATTERN_DET:

uart_get_buffered_data_len(EX_UART_NUM, &buffered_size);

int pos = uart_pattern_pop_pos(EX_UART_NUM);

ESP_LOGI(TAG, "[UART PATTERN DETECTED] pos: %d, buffered size: %d", pos, buffered_size);

if (pos == -1) {

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值