<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>NXP DesignsのトピックUART RTOS Receive status kStatus_UART_RxHardwareOverrun</title>
    <link>https://community.nxp.com/t5/NXP-Designs/UART-RTOS-Receive-status-kStatus-UART-RxHardwareOverrun/m-p/1593379#M1028</link>
    <description>&lt;P&gt;My English is not very good.&lt;/P&gt;&lt;P&gt;I’m new with freertos, I’m having a hard time solving the following situation:&lt;BR /&gt;The UART_RTOS_Receive function is returning the status kStatus_UART_RxHardwareOverrun I am not able to solve it, I created a modbus code to communicate with the computer.&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;It could help/assist me. I'll leave my code below:&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;///*&lt;BR /&gt;// * modbus_freertos.c&lt;BR /&gt;// *&lt;BR /&gt;// * Created on: 26 de dez de 2022&lt;BR /&gt;// */&lt;BR /&gt;//&lt;BR /&gt;#include "modbus_freertos.h"&lt;BR /&gt;//&lt;BR /&gt;#define UART_MODBUS_RX_BUFFER_SIZE 256&lt;BR /&gt;#define UART_MODBUS_TX_BUFFER_SIZE 260&lt;/P&gt;&lt;P&gt;&lt;BR /&gt;typedef enum{&lt;BR /&gt;read_multiple_register = 3,&lt;BR /&gt;write_single_register = 6,&lt;BR /&gt;write_multiple_register = 16&lt;BR /&gt;}function_modbus_t;&lt;/P&gt;&lt;P&gt;typedef struct {&lt;BR /&gt;uint8_t rx_buffer[UART_MODBUS_RX_BUFFER_SIZE];&lt;BR /&gt;uint8_t tx_buffer[UART_MODBUS_TX_BUFFER_SIZE];&lt;BR /&gt;size_t rx_nBytes;&lt;BR /&gt;size_t tx_nBytes;&lt;BR /&gt;}modbus_t;&lt;/P&gt;&lt;P&gt;modbus_t modbus;&lt;/P&gt;&lt;P&gt;uint8_t get_size_request(uint8_t* buffer);&lt;BR /&gt;unsigned short CRC16Table256(int i);&lt;BR /&gt;unsigned short update_crc_16( unsigned short crc, char c );&lt;BR /&gt;unsigned short CRC16(unsigned char *ptr,int npts);&lt;BR /&gt;void CopySwapBuf(unsigned char *copy_buffer, unsigned char *paste_buffer, uint8_t init_buffer, uint8_t size);&lt;BR /&gt;status_t compare_crc(uint16_t crc_calculate, uint16_t crc_receive_high, uint16_t crc_receive_low);&lt;BR /&gt;void get_multiple_registers(uint8_t* buffer);&lt;BR /&gt;void set_single_register(uint8_t* buffer);&lt;BR /&gt;void set_multiple_register(uint8_t* buffer);&lt;/P&gt;&lt;P&gt;&lt;BR /&gt;/* ------------------------------------ Calcular CRC ------------------------------------------*/&lt;BR /&gt;unsigned short CRC16Table256(int i){&lt;BR /&gt;unsigned short crc,c,j;&lt;BR /&gt;crc = 0;&lt;BR /&gt;c = (unsigned short) i;&lt;BR /&gt;for (j=0; j&amp;lt;8; j++) {&lt;BR /&gt;if ( (crc ^ c) &amp;amp; 0x0001 ) crc = ( crc &amp;gt;&amp;gt; 1 ) ^ 0xA001;&lt;BR /&gt;else crc = crc &amp;gt;&amp;gt; 1;&lt;BR /&gt;c = c &amp;gt;&amp;gt; 1;&lt;BR /&gt;}&lt;BR /&gt;return crc;&lt;BR /&gt;}&lt;/P&gt;&lt;P&gt;unsigned short update_crc_16(unsigned short crc, char c ) {&lt;BR /&gt;unsigned short tmp, short_c;&lt;BR /&gt;short_c = 0x00ff &amp;amp; (unsigned short) c;&lt;BR /&gt;tmp = crc ^ short_c;&lt;BR /&gt;crc = (crc &amp;gt;&amp;gt; &lt;LI-EMOJI id="lia_smiling-face-with-sunglasses" title=":smiling_face_with_sunglasses:"&gt;&lt;/LI-EMOJI&gt; ^ CRC16Table256((int)tmp &amp;amp; 0xff);&lt;BR /&gt;return crc;&lt;BR /&gt;}&lt;/P&gt;&lt;P&gt;unsigned short CRC16(unsigned char *ptr,int npts){&lt;BR /&gt;unsigned short crc;&lt;BR /&gt;int i;&lt;BR /&gt;crc=0xffff; // Valor inicial para CRC16modbus&lt;BR /&gt;for(i=0;i&amp;lt;npts;i++) {&lt;BR /&gt;crc=update_crc_16(crc,(char) *(ptr+i));&lt;BR /&gt;}&lt;BR /&gt;return crc;&lt;BR /&gt;}&lt;/P&gt;&lt;P&gt;status_t compare_crc(uint16_t crc_calculate, uint16_t crc_receive_high, uint16_t crc_receive_low){&lt;BR /&gt;if (((crc_calculate &amp;amp; 0x00FF) == crc_receive_high) &amp;amp;&amp;amp; ((crc_calculate &amp;gt;&amp;gt; &lt;LI-EMOJI id="lia_smiling-face-with-sunglasses" title=":smiling_face_with_sunglasses:"&gt;&lt;/LI-EMOJI&gt; == crc_receive_low)) return kStatus_Success;&lt;BR /&gt;return kStatus_Fail;&lt;BR /&gt;}&lt;/P&gt;&lt;P&gt;/* ----------------------------------- Copia um buffer para outro ----------------------------------*/&lt;BR /&gt;void CopySwapBuf(unsigned char *copy_buffer, unsigned char *paste_buffer, uint8_t init_buffer, uint8_t size){&lt;BR /&gt;uint8_t inc_pst = init_buffer;&lt;BR /&gt;for(uint8_t inc_cpy = 0; inc_cpy &amp;lt; size; inc_cpy++){&lt;BR /&gt;paste_buffer[inc_pst] = copy_buffer[inc_cpy];&lt;BR /&gt;inc_pst++;&lt;BR /&gt;}&lt;BR /&gt;}&lt;/P&gt;&lt;P&gt;/* ----------------------------------- Tarefa modbus ------------ ----------------------------------*/&lt;BR /&gt;void modbus_task(void *param){&lt;BR /&gt;status_t status;&lt;BR /&gt;uint16_t crc;&lt;BR /&gt;uint8_t rxsize;&lt;BR /&gt;uint8_t process_buffer[UART_MODBUS_RX_BUFFER_SIZE];&amp;nbsp;&lt;BR /&gt;while(1){&lt;BR /&gt;memset(process_buffer, 0, UART_MODBUS_RX_BUFFER_SIZE);&lt;BR /&gt;memset(modbus.rx_buffer, 0, UART_MODBUS_RX_BUFFER_SIZE);&lt;BR /&gt;rxsize = 2;&lt;BR /&gt;status = UART_RTOS_Receive(&amp;amp;UART_MODBUS_rtos_handle, modbus.rx_buffer, rxsize, &amp;amp;modbus.rx_nBytes);&lt;BR /&gt;if(status == kStatus_Success)&lt;BR /&gt;{&lt;BR /&gt;if( xSemaphoreTake( UART_MODBUS_rtos_handle.rxSemaphore, ( TickType_t ) 3 ) == pdTRUE ) //Tenta pegar o semáforo&lt;BR /&gt;{&lt;BR /&gt;CopySwapBuf((uint8_t *)&amp;amp;modbus.rx_buffer, (uint8_t *)&amp;amp;process_buffer, 0, rxsize);&amp;nbsp;&lt;BR /&gt;xSemaphoreGive(UART_MODBUS_rtos_handle.rxSemaphore);&lt;BR /&gt;}&lt;BR /&gt;else add_log(ModbusError);&lt;BR /&gt;rxsize = get_size_request(process_buffer);&amp;nbsp;&lt;BR /&gt;status = UART_RTOS_Receive(&amp;amp;UART_MODBUS_rtos_handle, modbus.rx_buffer, rxsize, &amp;amp;modbus.rx_nBytes);&lt;BR /&gt;if (status == kStatus_Success)&lt;BR /&gt;{&lt;BR /&gt;if( xSemaphoreTake( UART_MODBUS_rtos_handle.rxSemaphore, ( TickType_t ) 3 ) == pdTRUE )&amp;nbsp;&lt;BR /&gt;{&lt;BR /&gt;CopySwapBuf((uint8_t *)&amp;amp;modbus.rx_buffer, (uint8_t *)&amp;amp;process_buffer, 2, rxsize); /&lt;BR /&gt;xSemaphoreGive(UART_MODBUS_rtos_handle.rxSemaphore);&lt;BR /&gt;}&lt;BR /&gt;else add_log(ModbusError);&lt;BR /&gt;if(process_buffer[0] == get_par_int16(iMB_ADDRESS))&amp;nbsp;&lt;BR /&gt;{&lt;BR /&gt;crc = CRC16(process_buffer, rxsize);&amp;nbsp;&lt;BR /&gt;if (compare_crc(crc, process_buffer[rxsize], process_buffer[rxsize + 1]) == kStatus_Success)&amp;nbsp;&lt;BR /&gt;{&lt;BR /&gt;switch(process_buffer[1])&lt;BR /&gt;{&lt;BR /&gt;case read_multiple_register: get_multiple_registers(process_buffer);&lt;BR /&gt;break;&lt;BR /&gt;case write_single_register: set_single_register(process_buffer);&lt;BR /&gt;break;&lt;BR /&gt;case write_multiple_register: set_multiple_register(process_buffer);&lt;BR /&gt;break;&lt;BR /&gt;default: break;&lt;BR /&gt;}&lt;BR /&gt;}&lt;BR /&gt;}&lt;BR /&gt;}&lt;BR /&gt;}&lt;BR /&gt;}&lt;BR /&gt;}&lt;/P&gt;&lt;P&gt;uint8_t get_size_request(uint8_t* buffer){&lt;BR /&gt;uint8_t size = 0;&lt;BR /&gt;if(buffer[1] == 3) size = (7 + 1 - 2);&lt;BR /&gt;if(buffer[1] == 6) size = (7 + 1 - 2);&lt;BR /&gt;if(buffer[1] == 16) size = ((buffer[5] * 2) + 9 - 2);&lt;BR /&gt;return size;&lt;BR /&gt;}&lt;/P&gt;&lt;P&gt;/* -------------------------------------------- Funções modbus --------------------------------------------*/&lt;BR /&gt;void get_multiple_registers(uint8_t* buffer){&lt;BR /&gt;int cont_tx = 3;&lt;BR /&gt;uint16_t crc;&lt;BR /&gt;uint16_t addr_reg = ((buffer[2] &amp;lt;&amp;lt; &lt;LI-EMOJI id="lia_smiling-face-with-sunglasses" title=":smiling_face_with_sunglasses:"&gt;&lt;/LI-EMOJI&gt; | buffer[3]);&lt;BR /&gt;uint16_t size_buffer = ((buffer[4] &amp;lt;&amp;lt; &lt;LI-EMOJI id="lia_smiling-face-with-sunglasses" title=":smiling_face_with_sunglasses:"&gt;&lt;/LI-EMOJI&gt; | buffer[5]);&lt;/P&gt;&lt;P&gt;if ((addr_reg + size_buffer) &amp;lt; (SIZE_READ+SIZE_CFG+SIZE_CALIB)){&amp;nbsp;&lt;BR /&gt;crc = 0;&lt;BR /&gt;modbus.tx_buffer[0] = buffer[0];&lt;BR /&gt;modbus.tx_buffer[1] = read_multiple_register;&amp;nbsp;&lt;BR /&gt;modbus.tx_buffer[2] = (size_buffer * 2);&amp;nbsp;&lt;/P&gt;&lt;P&gt;for (int i = addr_reg; i &amp;lt; size_buffer; i++) {&amp;nbsp;&lt;BR /&gt;modbus.tx_buffer[cont_tx] = (get_par_uint16_modbus(i) &amp;gt;&amp;gt; 8);&lt;BR /&gt;cont_tx++;&lt;BR /&gt;modbus.tx_buffer[cont_tx] = (get_par_uint16_modbus(i) &amp;amp; 0xff);&lt;BR /&gt;cont_tx++;&lt;BR /&gt;}&lt;BR /&gt;crc = CRC16(modbus.tx_buffer, cont_tx);&amp;nbsp;&lt;BR /&gt;modbus.tx_buffer[cont_tx++] = (crc &amp;amp; 0xff);&lt;BR /&gt;modbus.tx_buffer[cont_tx++] = (crc &amp;gt;&amp;gt; 8);&lt;BR /&gt;modbus.tx_nBytes = cont_tx;&lt;BR /&gt;UART_RTOS_Send(&amp;amp;UART_MODBUS_rtos_handle, modbus.tx_buffer, modbus.tx_nBytes);&lt;BR /&gt;}&lt;BR /&gt;}&lt;/P&gt;&lt;P&gt;void set_single_register(uint8_t* buffer){&lt;BR /&gt;uint16_t sinc_status;&lt;BR /&gt;uint16_t reg;&lt;BR /&gt;uint16_t value;&lt;BR /&gt;uint16_t crc;&lt;/P&gt;&lt;P&gt;sinc_status = get_par_int16(iSTATUS_SINC);&amp;nbsp;&lt;BR /&gt;reg = buffer[2] &amp;lt;&amp;lt; 8;&amp;nbsp;&lt;BR /&gt;reg = reg + buffer[3];&lt;BR /&gt;value = buffer[4] &amp;lt;&amp;lt; 8;&lt;BR /&gt;value = value + buffer[5];&lt;/P&gt;&lt;P&gt;if (sinc_status == Iddle || sinc_status == Testing)&amp;nbsp;&lt;BR /&gt;{&lt;BR /&gt;if(reg &amp;gt; SIZE_READ)&amp;nbsp;&lt;BR /&gt;set_par_uint16_modbus(reg, value);&lt;BR /&gt;}&lt;BR /&gt;if ((reg - SIZE_HEADER) == (iRECEIVE_CMD_MB - OFFSET_READ)) /&lt;BR /&gt;set_par_int16(iRECEIVE_CMD_MB, value);&lt;/P&gt;&lt;P&gt;/* Prepara para devolver a informação da modbus */&lt;BR /&gt;modbus.tx_buffer[0] = buffer[0];&lt;BR /&gt;modbus.tx_buffer[1] = buffer[1];&lt;BR /&gt;modbus.tx_buffer[2] = buffer[2];&lt;BR /&gt;modbus.tx_buffer[3] = buffer[3];&lt;BR /&gt;modbus.tx_buffer[4] = buffer[4];&lt;BR /&gt;modbus.tx_buffer[5] = buffer[5];&lt;BR /&gt;crc = CRC16(modbus.tx_buffer, 6);&amp;nbsp;&lt;BR /&gt;modbus.tx_buffer[6] = (crc &amp;amp; 0x00ff);&amp;nbsp;&lt;BR /&gt;modbus.tx_buffer[7] = (crc &amp;gt;&amp;gt; 8);&amp;nbsp;&lt;BR /&gt;modbus.tx_nBytes = 8;&lt;BR /&gt;UART_RTOS_Send(&amp;amp;UART_MODBUS_rtos_handle, modbus.tx_buffer, modbus.tx_nBytes);&lt;BR /&gt;}&lt;/P&gt;&lt;P&gt;void set_multiple_register(uint8_t* buffer){&lt;/P&gt;&lt;P&gt;}&lt;/P&gt;</description>
    <pubDate>Fri, 03 Feb 2023 21:05:18 GMT</pubDate>
    <dc:creator>higor</dc:creator>
    <dc:date>2023-02-03T21:05:18Z</dc:date>
    <item>
      <title>UART RTOS Receive status kStatus_UART_RxHardwareOverrun</title>
      <link>https://community.nxp.com/t5/NXP-Designs/UART-RTOS-Receive-status-kStatus-UART-RxHardwareOverrun/m-p/1593379#M1028</link>
      <description>&lt;P&gt;My English is not very good.&lt;/P&gt;&lt;P&gt;I’m new with freertos, I’m having a hard time solving the following situation:&lt;BR /&gt;The UART_RTOS_Receive function is returning the status kStatus_UART_RxHardwareOverrun I am not able to solve it, I created a modbus code to communicate with the computer.&lt;/P&gt;&lt;P&gt;&lt;SPAN&gt;It could help/assist me. I'll leave my code below:&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;///*&lt;BR /&gt;// * modbus_freertos.c&lt;BR /&gt;// *&lt;BR /&gt;// * Created on: 26 de dez de 2022&lt;BR /&gt;// */&lt;BR /&gt;//&lt;BR /&gt;#include "modbus_freertos.h"&lt;BR /&gt;//&lt;BR /&gt;#define UART_MODBUS_RX_BUFFER_SIZE 256&lt;BR /&gt;#define UART_MODBUS_TX_BUFFER_SIZE 260&lt;/P&gt;&lt;P&gt;&lt;BR /&gt;typedef enum{&lt;BR /&gt;read_multiple_register = 3,&lt;BR /&gt;write_single_register = 6,&lt;BR /&gt;write_multiple_register = 16&lt;BR /&gt;}function_modbus_t;&lt;/P&gt;&lt;P&gt;typedef struct {&lt;BR /&gt;uint8_t rx_buffer[UART_MODBUS_RX_BUFFER_SIZE];&lt;BR /&gt;uint8_t tx_buffer[UART_MODBUS_TX_BUFFER_SIZE];&lt;BR /&gt;size_t rx_nBytes;&lt;BR /&gt;size_t tx_nBytes;&lt;BR /&gt;}modbus_t;&lt;/P&gt;&lt;P&gt;modbus_t modbus;&lt;/P&gt;&lt;P&gt;uint8_t get_size_request(uint8_t* buffer);&lt;BR /&gt;unsigned short CRC16Table256(int i);&lt;BR /&gt;unsigned short update_crc_16( unsigned short crc, char c );&lt;BR /&gt;unsigned short CRC16(unsigned char *ptr,int npts);&lt;BR /&gt;void CopySwapBuf(unsigned char *copy_buffer, unsigned char *paste_buffer, uint8_t init_buffer, uint8_t size);&lt;BR /&gt;status_t compare_crc(uint16_t crc_calculate, uint16_t crc_receive_high, uint16_t crc_receive_low);&lt;BR /&gt;void get_multiple_registers(uint8_t* buffer);&lt;BR /&gt;void set_single_register(uint8_t* buffer);&lt;BR /&gt;void set_multiple_register(uint8_t* buffer);&lt;/P&gt;&lt;P&gt;&lt;BR /&gt;/* ------------------------------------ Calcular CRC ------------------------------------------*/&lt;BR /&gt;unsigned short CRC16Table256(int i){&lt;BR /&gt;unsigned short crc,c,j;&lt;BR /&gt;crc = 0;&lt;BR /&gt;c = (unsigned short) i;&lt;BR /&gt;for (j=0; j&amp;lt;8; j++) {&lt;BR /&gt;if ( (crc ^ c) &amp;amp; 0x0001 ) crc = ( crc &amp;gt;&amp;gt; 1 ) ^ 0xA001;&lt;BR /&gt;else crc = crc &amp;gt;&amp;gt; 1;&lt;BR /&gt;c = c &amp;gt;&amp;gt; 1;&lt;BR /&gt;}&lt;BR /&gt;return crc;&lt;BR /&gt;}&lt;/P&gt;&lt;P&gt;unsigned short update_crc_16(unsigned short crc, char c ) {&lt;BR /&gt;unsigned short tmp, short_c;&lt;BR /&gt;short_c = 0x00ff &amp;amp; (unsigned short) c;&lt;BR /&gt;tmp = crc ^ short_c;&lt;BR /&gt;crc = (crc &amp;gt;&amp;gt; &lt;LI-EMOJI id="lia_smiling-face-with-sunglasses" title=":smiling_face_with_sunglasses:"&gt;&lt;/LI-EMOJI&gt; ^ CRC16Table256((int)tmp &amp;amp; 0xff);&lt;BR /&gt;return crc;&lt;BR /&gt;}&lt;/P&gt;&lt;P&gt;unsigned short CRC16(unsigned char *ptr,int npts){&lt;BR /&gt;unsigned short crc;&lt;BR /&gt;int i;&lt;BR /&gt;crc=0xffff; // Valor inicial para CRC16modbus&lt;BR /&gt;for(i=0;i&amp;lt;npts;i++) {&lt;BR /&gt;crc=update_crc_16(crc,(char) *(ptr+i));&lt;BR /&gt;}&lt;BR /&gt;return crc;&lt;BR /&gt;}&lt;/P&gt;&lt;P&gt;status_t compare_crc(uint16_t crc_calculate, uint16_t crc_receive_high, uint16_t crc_receive_low){&lt;BR /&gt;if (((crc_calculate &amp;amp; 0x00FF) == crc_receive_high) &amp;amp;&amp;amp; ((crc_calculate &amp;gt;&amp;gt; &lt;LI-EMOJI id="lia_smiling-face-with-sunglasses" title=":smiling_face_with_sunglasses:"&gt;&lt;/LI-EMOJI&gt; == crc_receive_low)) return kStatus_Success;&lt;BR /&gt;return kStatus_Fail;&lt;BR /&gt;}&lt;/P&gt;&lt;P&gt;/* ----------------------------------- Copia um buffer para outro ----------------------------------*/&lt;BR /&gt;void CopySwapBuf(unsigned char *copy_buffer, unsigned char *paste_buffer, uint8_t init_buffer, uint8_t size){&lt;BR /&gt;uint8_t inc_pst = init_buffer;&lt;BR /&gt;for(uint8_t inc_cpy = 0; inc_cpy &amp;lt; size; inc_cpy++){&lt;BR /&gt;paste_buffer[inc_pst] = copy_buffer[inc_cpy];&lt;BR /&gt;inc_pst++;&lt;BR /&gt;}&lt;BR /&gt;}&lt;/P&gt;&lt;P&gt;/* ----------------------------------- Tarefa modbus ------------ ----------------------------------*/&lt;BR /&gt;void modbus_task(void *param){&lt;BR /&gt;status_t status;&lt;BR /&gt;uint16_t crc;&lt;BR /&gt;uint8_t rxsize;&lt;BR /&gt;uint8_t process_buffer[UART_MODBUS_RX_BUFFER_SIZE];&amp;nbsp;&lt;BR /&gt;while(1){&lt;BR /&gt;memset(process_buffer, 0, UART_MODBUS_RX_BUFFER_SIZE);&lt;BR /&gt;memset(modbus.rx_buffer, 0, UART_MODBUS_RX_BUFFER_SIZE);&lt;BR /&gt;rxsize = 2;&lt;BR /&gt;status = UART_RTOS_Receive(&amp;amp;UART_MODBUS_rtos_handle, modbus.rx_buffer, rxsize, &amp;amp;modbus.rx_nBytes);&lt;BR /&gt;if(status == kStatus_Success)&lt;BR /&gt;{&lt;BR /&gt;if( xSemaphoreTake( UART_MODBUS_rtos_handle.rxSemaphore, ( TickType_t ) 3 ) == pdTRUE ) //Tenta pegar o semáforo&lt;BR /&gt;{&lt;BR /&gt;CopySwapBuf((uint8_t *)&amp;amp;modbus.rx_buffer, (uint8_t *)&amp;amp;process_buffer, 0, rxsize);&amp;nbsp;&lt;BR /&gt;xSemaphoreGive(UART_MODBUS_rtos_handle.rxSemaphore);&lt;BR /&gt;}&lt;BR /&gt;else add_log(ModbusError);&lt;BR /&gt;rxsize = get_size_request(process_buffer);&amp;nbsp;&lt;BR /&gt;status = UART_RTOS_Receive(&amp;amp;UART_MODBUS_rtos_handle, modbus.rx_buffer, rxsize, &amp;amp;modbus.rx_nBytes);&lt;BR /&gt;if (status == kStatus_Success)&lt;BR /&gt;{&lt;BR /&gt;if( xSemaphoreTake( UART_MODBUS_rtos_handle.rxSemaphore, ( TickType_t ) 3 ) == pdTRUE )&amp;nbsp;&lt;BR /&gt;{&lt;BR /&gt;CopySwapBuf((uint8_t *)&amp;amp;modbus.rx_buffer, (uint8_t *)&amp;amp;process_buffer, 2, rxsize); /&lt;BR /&gt;xSemaphoreGive(UART_MODBUS_rtos_handle.rxSemaphore);&lt;BR /&gt;}&lt;BR /&gt;else add_log(ModbusError);&lt;BR /&gt;if(process_buffer[0] == get_par_int16(iMB_ADDRESS))&amp;nbsp;&lt;BR /&gt;{&lt;BR /&gt;crc = CRC16(process_buffer, rxsize);&amp;nbsp;&lt;BR /&gt;if (compare_crc(crc, process_buffer[rxsize], process_buffer[rxsize + 1]) == kStatus_Success)&amp;nbsp;&lt;BR /&gt;{&lt;BR /&gt;switch(process_buffer[1])&lt;BR /&gt;{&lt;BR /&gt;case read_multiple_register: get_multiple_registers(process_buffer);&lt;BR /&gt;break;&lt;BR /&gt;case write_single_register: set_single_register(process_buffer);&lt;BR /&gt;break;&lt;BR /&gt;case write_multiple_register: set_multiple_register(process_buffer);&lt;BR /&gt;break;&lt;BR /&gt;default: break;&lt;BR /&gt;}&lt;BR /&gt;}&lt;BR /&gt;}&lt;BR /&gt;}&lt;BR /&gt;}&lt;BR /&gt;}&lt;BR /&gt;}&lt;/P&gt;&lt;P&gt;uint8_t get_size_request(uint8_t* buffer){&lt;BR /&gt;uint8_t size = 0;&lt;BR /&gt;if(buffer[1] == 3) size = (7 + 1 - 2);&lt;BR /&gt;if(buffer[1] == 6) size = (7 + 1 - 2);&lt;BR /&gt;if(buffer[1] == 16) size = ((buffer[5] * 2) + 9 - 2);&lt;BR /&gt;return size;&lt;BR /&gt;}&lt;/P&gt;&lt;P&gt;/* -------------------------------------------- Funções modbus --------------------------------------------*/&lt;BR /&gt;void get_multiple_registers(uint8_t* buffer){&lt;BR /&gt;int cont_tx = 3;&lt;BR /&gt;uint16_t crc;&lt;BR /&gt;uint16_t addr_reg = ((buffer[2] &amp;lt;&amp;lt; &lt;LI-EMOJI id="lia_smiling-face-with-sunglasses" title=":smiling_face_with_sunglasses:"&gt;&lt;/LI-EMOJI&gt; | buffer[3]);&lt;BR /&gt;uint16_t size_buffer = ((buffer[4] &amp;lt;&amp;lt; &lt;LI-EMOJI id="lia_smiling-face-with-sunglasses" title=":smiling_face_with_sunglasses:"&gt;&lt;/LI-EMOJI&gt; | buffer[5]);&lt;/P&gt;&lt;P&gt;if ((addr_reg + size_buffer) &amp;lt; (SIZE_READ+SIZE_CFG+SIZE_CALIB)){&amp;nbsp;&lt;BR /&gt;crc = 0;&lt;BR /&gt;modbus.tx_buffer[0] = buffer[0];&lt;BR /&gt;modbus.tx_buffer[1] = read_multiple_register;&amp;nbsp;&lt;BR /&gt;modbus.tx_buffer[2] = (size_buffer * 2);&amp;nbsp;&lt;/P&gt;&lt;P&gt;for (int i = addr_reg; i &amp;lt; size_buffer; i++) {&amp;nbsp;&lt;BR /&gt;modbus.tx_buffer[cont_tx] = (get_par_uint16_modbus(i) &amp;gt;&amp;gt; 8);&lt;BR /&gt;cont_tx++;&lt;BR /&gt;modbus.tx_buffer[cont_tx] = (get_par_uint16_modbus(i) &amp;amp; 0xff);&lt;BR /&gt;cont_tx++;&lt;BR /&gt;}&lt;BR /&gt;crc = CRC16(modbus.tx_buffer, cont_tx);&amp;nbsp;&lt;BR /&gt;modbus.tx_buffer[cont_tx++] = (crc &amp;amp; 0xff);&lt;BR /&gt;modbus.tx_buffer[cont_tx++] = (crc &amp;gt;&amp;gt; 8);&lt;BR /&gt;modbus.tx_nBytes = cont_tx;&lt;BR /&gt;UART_RTOS_Send(&amp;amp;UART_MODBUS_rtos_handle, modbus.tx_buffer, modbus.tx_nBytes);&lt;BR /&gt;}&lt;BR /&gt;}&lt;/P&gt;&lt;P&gt;void set_single_register(uint8_t* buffer){&lt;BR /&gt;uint16_t sinc_status;&lt;BR /&gt;uint16_t reg;&lt;BR /&gt;uint16_t value;&lt;BR /&gt;uint16_t crc;&lt;/P&gt;&lt;P&gt;sinc_status = get_par_int16(iSTATUS_SINC);&amp;nbsp;&lt;BR /&gt;reg = buffer[2] &amp;lt;&amp;lt; 8;&amp;nbsp;&lt;BR /&gt;reg = reg + buffer[3];&lt;BR /&gt;value = buffer[4] &amp;lt;&amp;lt; 8;&lt;BR /&gt;value = value + buffer[5];&lt;/P&gt;&lt;P&gt;if (sinc_status == Iddle || sinc_status == Testing)&amp;nbsp;&lt;BR /&gt;{&lt;BR /&gt;if(reg &amp;gt; SIZE_READ)&amp;nbsp;&lt;BR /&gt;set_par_uint16_modbus(reg, value);&lt;BR /&gt;}&lt;BR /&gt;if ((reg - SIZE_HEADER) == (iRECEIVE_CMD_MB - OFFSET_READ)) /&lt;BR /&gt;set_par_int16(iRECEIVE_CMD_MB, value);&lt;/P&gt;&lt;P&gt;/* Prepara para devolver a informação da modbus */&lt;BR /&gt;modbus.tx_buffer[0] = buffer[0];&lt;BR /&gt;modbus.tx_buffer[1] = buffer[1];&lt;BR /&gt;modbus.tx_buffer[2] = buffer[2];&lt;BR /&gt;modbus.tx_buffer[3] = buffer[3];&lt;BR /&gt;modbus.tx_buffer[4] = buffer[4];&lt;BR /&gt;modbus.tx_buffer[5] = buffer[5];&lt;BR /&gt;crc = CRC16(modbus.tx_buffer, 6);&amp;nbsp;&lt;BR /&gt;modbus.tx_buffer[6] = (crc &amp;amp; 0x00ff);&amp;nbsp;&lt;BR /&gt;modbus.tx_buffer[7] = (crc &amp;gt;&amp;gt; 8);&amp;nbsp;&lt;BR /&gt;modbus.tx_nBytes = 8;&lt;BR /&gt;UART_RTOS_Send(&amp;amp;UART_MODBUS_rtos_handle, modbus.tx_buffer, modbus.tx_nBytes);&lt;BR /&gt;}&lt;/P&gt;&lt;P&gt;void set_multiple_register(uint8_t* buffer){&lt;/P&gt;&lt;P&gt;}&lt;/P&gt;</description>
      <pubDate>Fri, 03 Feb 2023 21:05:18 GMT</pubDate>
      <guid>https://community.nxp.com/t5/NXP-Designs/UART-RTOS-Receive-status-kStatus-UART-RxHardwareOverrun/m-p/1593379#M1028</guid>
      <dc:creator>higor</dc:creator>
      <dc:date>2023-02-03T21:05:18Z</dc:date>
    </item>
  </channel>
</rss>

