使用Non-os SDK 的8266做485通信

 相信很多人在ESP8266的485通信中头疼过,485通信ic是半双工的,该ic是需要有RE/DE信号决定发送或者接收方向的。当然你也可以用三极管或者内部集成了REDE的IC,这不在此文的讨论范围。

由于8266的串口使用了FIFO,如果单纯在uart0_tx_buffer这个过程中控制IO口的高低电平,在实际使用中会发现该IO的电平是和发送过程异步的,而且持续时间极短。这让大部分采用485通信的方案选择了增加一个三极管做信号转换。

对此我使用以下方法解决:

我在uart0_tx_buffer发送过程中,先把io电平拉高开始发送,再启动一个定时器,在定时器回调函数里不断检测FIFO,如果空了,就把IO口拉低,顺便销毁定时器。

代码如下:

定时器回调函数:

os_timer_t tx_finish_timer;
void ICACHE_FLASH_ATTR
tx_checkfinish(void)
{
	if(UART_CheckOutputFinished(UART0,0)){
		GPIO_OUTPUT_SET(GPIO_ID_PIN(4),0);
		os_timer_disarm(&tx_finish_timer);
		}
}

fifo检测函数

bool ICACHE_FLASH_ATTR
UART_CheckOutputFinished(uint8 uart_no, uint32 time_out_us)
{
    uint32 t_start = system_get_time();
    uint8 tx_fifo_len;
    uint32 tx_buff_len;
    while(1){
        tx_fifo_len =( (READ_PERI_REG(UART_STATUS

你可能感兴趣的:(单片机,嵌入式硬件)