В моем приложении у меня есть массив символов, который может принимать один из трех вариантов: «okay», «high», «low», которые затем отправляются по последовательному порту на удаленное устройство. Я в настоящее время имеет размер массива, чтобы взять 4 символьных слова плюс возврат каретки и фид строки, но когда мне нужно отправить «низкий», я получаю нулевой символ в строках, что, я думаю, путает терминал хоста.динамический размер массива массива
определение массива
char mod1_status_char[6] = {'0','0','0','0','0','0'};
char mod2_status_char[6] = {'0','0','0','0','0','0'};
char mod3_status_char[6] = {'0','0','0','0','0','0'};
образец переключатель сазе:
void DCOKStatus(uint8_t *ptr_status)
{
uint8_t status = *ptr_status;
switch (status)
{
case 0x00:
strcpy(mod1_status_char, "okay");
strcpy(mod2_status_char, "okay");
strcpy(mod3_status_char, "okay");
break;
case 0x10:
strcpy(mod1_status_char, "okay");
strcpy(mod2_status_char, "okay");
strcpy(mod3_status_char, "low");
break;
}
Это структура, которая делает строку сообщения для отправки
strcpy(MsgStatus_on.descriptor_msg, "$psu_");
MsgStatus_on.address01 = hex_addr[0];
MsgStatus_on.address02 = hex_addr[1];
MsgStatus_on.space01 = 0x20;
strcpy(MsgStatus_on.cmdmsg01, "op_en op1_");
strcpy(MsgStatus_on.statusmsg01, mod1_status_char);
MsgStatus_on.space02 = 0x20;
strcpy(MsgStatus_on.cmdmsg02, "op2_");
strcpy(MsgStatus_on.statusmsg02, mod2_status_char);
MsgStatus_on.space03 = 0x20;
strcpy(MsgStatus_on.cmdmsg03, "op3_");
strcpy(MsgStatus_on.statusmsg03, mod3_status_char);
MsgStatus_on.CR = 0x0D;
MsgStatus_on.LF = 0x0A;
и это посылает сообщение
void USARTWrite(char *object, uint32_t size)
{
GPIO_SetBits(GPIOB, GPIO_Pin_1);
char *byte;
for (byte = object; size--; ++byte)
{
USART_SendData(USART1,*byte);
}
Может ли кто-нибудь предложить хороший подход к динамическому размеру массива до одного символа короче, когда мне нужно отправить «низкий»?
Благодаря
Непонятно, что именно должен содержать массив. Можете ли вы опубликовать код, показывающий, как определяется и используется массив, или уточнить? –
Почему динамический размер массива? Сделайте строку/массив любым размером, который вы хотите, и напишите свою процедуру вывода, чтобы она остановилась, когда увидит CR/LF (игнорируя лишние символы, оставшиеся в массиве). – bta
Если вы не NULL-завершаете свои строки, вы, вероятно, захотите избежать использования 'strcpy()', поскольку он будет копировать, пока не увидит '' \ 0''. Вместо этого используйте 'strncpy()', чтобы вы могли указать максимальное количество символов для копирования. – bta