在我的应用程序中,我定义了一个char数组,它可以采用以下三个选项之一:"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); }
当我需要发送"低"时,是否有人能够建议一个好的方法来动态调整数组大小到一个字符?
谢谢
我不认为要调用动态大小的数组.C语言中有两种方法可以动态调整数组大小:使用malloc
或类似地分配它; 或使用C99 VLA.但是在这种情况下,你有不同长度的字符串,当然重要的是按正确的顺序写正确的字节?就个人而言,我更喜欢这样的事情,也许:
char * strings[] = {"okay\r\n", "high\r\n", "low\r\n"}; serial_send(strings[msg_number], strlen(strings[msg_number]));
您不必调用strlen,必须将长度存储在另一个数组中.但即使在最小的嵌入式设备上,与发送串行数据相比,数到6只需要很少的时间.
当然我假设你调用的任何函数实际发送数据,需要一个指针和一个长度.但如果没有,我不知道动态大小的数组如何帮助.
我认为这里难以回答这个问题的一般问题是你没有真正说出数组的"大小"是什么,或者为什么它与实际写入串口的字节数有什么关系港口.
编辑:通过你的额外解释,关键的事情似乎是这个结构,三个单独的字符串被"传入".不确定将字符串传递给struct意味着什么.如果它目前看起来像这样:
struct serialmessage { char first[6]; char second[6]; char third[6]; }; serialmessage msg; memcpy(msg.first, mod1_status_char, 6); // etc.
那么也许最好这样做:
char *char mod1_status_char; // etc. switch(status) { case 0x00: mod1_status_char = strings[0]; // or #define STATUS_OK 0 mod2_status_char = strings[0]; mod3_status_char = strings[0]; break; case 0x10: mod1_status_char = strings[0]; mod2_status_char = strings[0]; mod3_status_char = strings[2]; // STATUS_LOW }; serialmessage msg[3*MAX_STRING_LENGTH+1]; strcpy(msg, mod1_status_char); // or use stpcpy if you have it strcat(msg, mod2_status_char); strcat(msg, mod3_status_char);
然后使用strlen(msg)发送struct.msg在这里并不完全是"动态的",但它中字符串的长度根据数据而变化,这可能是你想要的.或许我仍然误解了这三个char数组的作用.
在我看来,复制字符串不仅仅是为了引入并发症.通过指针引用它们,直到最后可能的时刻,组装消息,并最小化代码中必须正确获取缓冲区大小的位置数.