2018-05-07 02:34 AM
Hello all,
I am really new at all this, I hope someone has a simple example to help.
I am trying to receive 9-bit data using the STM32-F103 in normal polling mode example code below
uint16_t
messages[30];
HAL_UART_Receive(&huart2, (
uint8_t
*)messages,
sizeof(messages),1000);
I thought a 16 bit register should be used to get all 9 bits, however looking at the data that is contained in the messages array, they are all over the place and I can't make sense of it and in most cases all 16 bits are populated when I'd expect only 9 bits populated in each element of the array.
Anybody got a simple solution for me?
Thank you all in advance
2018-05-07 05:50 AM
I wouldn't use sizeof() in this context, use 30 if you configured the USART in 9-bit.
Mask the content if required.
Provide example data, and minimally illustrative complete example if the problem persists.
2018-05-07 06:14 AM
>
I thought a 16 bit register should be used to get all 9 bits
Yes it is indeed. USART_DR[8:0] is 9 bits
The question is, how you are going to store 9 bits. STM32 does not have bit-oriented memory like 8051. So it won't fit in one byte, and two bytes is a bit excessive.
-- pa
2018-05-07 10:34 AM
If you using 9bit with no parity, you just read the receive register as uint16 and use the lower 9bits.
Parity is included in the STM32 data bit length.
If you need 9 data bits with parity, your going to need to use software serial.
Not sure if there is an equivalent package for F1...
But i was able to adapt this uart emulation package for F4, so i could work with a funky device that used 9-odd-2 serial.
2018-05-07 01:32 PM
Back in Uni, one of the networking guys gave a lecture on RS232 (way back). When asked about 2 stop bits, that is a holdover from teletypes that had a mechanical rotor to commutate the bits. 7 data bits, one parity bit, and 2 stop bits at 10 characters per second gave 110 baud. 2 stop bits wasn't used anywhere else, just for 110 baud on TTYs.
A
2018-05-07 04:27 PM
It increases the inter-symbol gap, which can be helpful for synchronization in systems where the USART implementation is super aggressive in the bit timing, and packing symbols tightly.
2018-05-08 02:23 AM
Thanks for all the replies,
this is what I have so far, the messages array is set to zero to eliminate any previous data, then the RX is called where I would expect the data in the RX buffer to be stored into the messages array, then buzz through a mask
void
UART_RXTX(
void)
{
int
i;
int
a;
char
message[]=
'start\r\n'
;
uint16_t
messages[10];
for
(i=0;i<10;i++)
{
messages[i]=0;
}
HAL_UART_Receive(&huart2, (
uint8_t
*)messages, 10,1000);
for
(i=0;i<10;i++)
{
a=messages[i] & 0x01FF;
messages[i]=a;
}
}
in the uart.c file, it is configured as such'
else if
(uartHandle->
Instance
==USART2)
{
/* USER CODE BEGIN USART2_MspInit 0 */
/* USER CODE END USART2_MspInit 0 */
/* USART2 clock enable */
__HAL_RCC_USART2_CLK_ENABLE();
/**USART2 GPIO Configuration
PA2 ------> USART2_TX
PA3 ------> USART2_RX
*/
GPIO_InitStruct.
Pin
= GPIO_PIN_2;
GPIO_InitStruct.
Mode
= GPIO_MODE_AF_PP;
GPIO_InitStruct.
Speed
= GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
GPIO_InitStruct.
Pin
= GPIO_PIN_3;
GPIO_InitStruct.
Mode
= GPIO_MODE_INPUT;
GPIO_InitStruct.
Pull
= GPIO_NOPULL;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
and
else if
(uartHandle->
Instance
==USART2)
{
/* USER CODE BEGIN USART2_MspDeInit 0 */
/* USER CODE END USART2_MspDeInit 0 */
/* Peripheral clock disable */
__HAL_RCC_USART2_CLK_DISABLE();
/**USART2 GPIO Configuration
PA2 ------> USART2_TX
PA3 ------> USART2_RX
*/
HAL_GPIO_DeInit(GPIOA, GPIO_PIN_2|GPIO_PIN_3);
So the final result is that there is nothing in the messages array, the connections were checked and all wiring is ok, however the messages array is always 0
any one have any ideas on what it could be?
2018-05-08 02:50 AM
So I got it to work using UART1, same configuration (different ports obviously), why does it work with UART1 and not UART2?
2018-05-08 08:25 AM
Let's not play these 'guess what's wrong' games. If you think it is a software side issue, ZIP up the minimal project, if you think it is the circuit, provide the relevant portion of the schematic.
Check obvious things like clocks, GPIO settings/clocks, and on F1 pin remapping and peripheral clashing issues.
USART1 and USART2 should use the same design, consider external connectivity.
2018-05-29 12:53 PM
I my case, the device used the high bit (9th bit) as a message delimiter. Start and end characters were marked with 0 in the 9th bit. The middle chars in the messages were marked with 1 in the 9th bit. I think the device vendor thought that using such that pita protocol would weed out the hackers! LOL