使用 UART 干扰从终端接收十六进制数据
Receiving Hex data from terminal using UART interference
我想从终端接收十六进制数据,例如 0x66、0x55、0x44、0x23、0x11、0xaa、0xbb、0xcc。通常我们可以通过 UART 接收字符串形式的消息。但我想从终端接收十六进制数据而不是字符或字符串。我正在使用 stm32cubemx HAL 库。
任何人都可以给我一个关于如何实现这个的解决方案吗?
所以,我终于找到了解决办法。实际任务是通过 UART 从终端接收十六进制数据,如 0x66、0x55、0x44、0x23、0x11、0xaa、0xbb、0xcc。收到十六进制值后,我需要通过 CAN 控制器传输这些值。所以,基本上有两个主要任务。
- 正在从终端接收十六进制值
- 存储十六进制值并通过 CAN 总线发送它们。
实际上我对第一个任务有疑问。为了首先解决问题,我将字符串拆分为十六进制字符串,其中每个字符串仅包含一个十六进制值。如果字符串类似于“12 34 aa bb cc 33 77 86”。令牌将像“12”“34”“aa”“bb”“cc”“33”“77”“86”。为此,我使用了 strtok() 函数。然后存储该标记并使用另一个函数 strtol() 将其转换为十六进制表示。
正确完成后,只需在 CAN 传输函数中发送值即可。
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) // Callback-Funktion für Empfangs interrupt
{
HAL_UART_Receive_IT(&huart2,&recvd_data,1); // Empfangs interrupt funktion
if(recvd_data == '\r') // wenn "Enter" gedrückt wird, ist der Empfang abgeschlossen
{
reception_complete = TRUE;
char *args[15];
int i =0; int j=0;
char *token = strtok(data_buffer, " \t\n");
while (token != NULL) {
args[i++] = token;
token = strtok(NULL, " \t\n");
}
//to print the array
for (j = 0; j < i; j++) {
printf("%s\r\n", args[j]);
}
int hexbase0=(int) strtol (args[0],NULL,16);
int hexbase1=(int) strtol (args[1],NULL,16);
int hexbase2=(int) strtol (args[2],NULL,16);
int hexbase3=(int) strtol (args[3],NULL,16);
int hexbase4=(int) strtol (args[4],NULL,16);
int hexbase5=(int) strtol (args[5],NULL,16);
int hexbase6=(int) strtol (args[6],NULL,16);
int hexbase7=(int) strtol (args[7],NULL,16);
int hexbase8=(int) strtol (args[8],NULL,16);
//printf("%x\r\n",hexbase);
//asciitobinary(data_buffer);
TxData[0] = hexbase1;
TxData[1] = hexbase2;
TxData[2] = hexbase3;
TxData[3] = hexbase4 ;
TxData[4] = hexbase5;
TxData[5] = hexbase6;
TxData[6] = hexbase7;
TxData[7] = hexbase8;
TxHeader.IDE = CAN_ID_STD;
TxHeader.StdId = hexbase0;
TxHeader.RTR = CAN_RTR_DATA;
TxHeader.DLC = 8;
if (HAL_CAN_AddTxMessage(&hcan, &TxHeader, (uint8_t*)TxData, &TxMailbox) != HAL_OK)
{
Error_Handler ();
}
//HAL_UART_Transmit(huart,data_buffer,count,HAL_MAX_DELAY);
data_buffer[count++]='\r';
for(count=10; count>0; count--) //buffer leer machen
{
data_buffer[count]=0;
}
}
else
{
data_buffer[count++] = recvd_data;
}
}
我想从终端接收十六进制数据,例如 0x66、0x55、0x44、0x23、0x11、0xaa、0xbb、0xcc。通常我们可以通过 UART 接收字符串形式的消息。但我想从终端接收十六进制数据而不是字符或字符串。我正在使用 stm32cubemx HAL 库。
任何人都可以给我一个关于如何实现这个的解决方案吗?
所以,我终于找到了解决办法。实际任务是通过 UART 从终端接收十六进制数据,如 0x66、0x55、0x44、0x23、0x11、0xaa、0xbb、0xcc。收到十六进制值后,我需要通过 CAN 控制器传输这些值。所以,基本上有两个主要任务。
- 正在从终端接收十六进制值
- 存储十六进制值并通过 CAN 总线发送它们。
实际上我对第一个任务有疑问。为了首先解决问题,我将字符串拆分为十六进制字符串,其中每个字符串仅包含一个十六进制值。如果字符串类似于“12 34 aa bb cc 33 77 86”。令牌将像“12”“34”“aa”“bb”“cc”“33”“77”“86”。为此,我使用了 strtok() 函数。然后存储该标记并使用另一个函数 strtol() 将其转换为十六进制表示。 正确完成后,只需在 CAN 传输函数中发送值即可。
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) // Callback-Funktion für Empfangs interrupt
{
HAL_UART_Receive_IT(&huart2,&recvd_data,1); // Empfangs interrupt funktion
if(recvd_data == '\r') // wenn "Enter" gedrückt wird, ist der Empfang abgeschlossen
{
reception_complete = TRUE;
char *args[15];
int i =0; int j=0;
char *token = strtok(data_buffer, " \t\n");
while (token != NULL) {
args[i++] = token;
token = strtok(NULL, " \t\n");
}
//to print the array
for (j = 0; j < i; j++) {
printf("%s\r\n", args[j]);
}
int hexbase0=(int) strtol (args[0],NULL,16);
int hexbase1=(int) strtol (args[1],NULL,16);
int hexbase2=(int) strtol (args[2],NULL,16);
int hexbase3=(int) strtol (args[3],NULL,16);
int hexbase4=(int) strtol (args[4],NULL,16);
int hexbase5=(int) strtol (args[5],NULL,16);
int hexbase6=(int) strtol (args[6],NULL,16);
int hexbase7=(int) strtol (args[7],NULL,16);
int hexbase8=(int) strtol (args[8],NULL,16);
//printf("%x\r\n",hexbase);
//asciitobinary(data_buffer);
TxData[0] = hexbase1;
TxData[1] = hexbase2;
TxData[2] = hexbase3;
TxData[3] = hexbase4 ;
TxData[4] = hexbase5;
TxData[5] = hexbase6;
TxData[6] = hexbase7;
TxData[7] = hexbase8;
TxHeader.IDE = CAN_ID_STD;
TxHeader.StdId = hexbase0;
TxHeader.RTR = CAN_RTR_DATA;
TxHeader.DLC = 8;
if (HAL_CAN_AddTxMessage(&hcan, &TxHeader, (uint8_t*)TxData, &TxMailbox) != HAL_OK)
{
Error_Handler ();
}
//HAL_UART_Transmit(huart,data_buffer,count,HAL_MAX_DELAY);
data_buffer[count++]='\r';
for(count=10; count>0; count--) //buffer leer machen
{
data_buffer[count]=0;
}
}
else
{
data_buffer[count++] = recvd_data;
}
}