
端末出力でヌル文字 '\0' を受信する際の予期しない動作について調査しています。2 つの \0 が含まれると予想される文字列を送信していますが、これは PuTTY には表示されません。
によるとこの質問PuTTY は通常の状況では null を送信しないことが示唆されています。ただし、この質問は 10 年近く前のものであり、その間に PuTTY は更新を受けているものと想定します。
私は調べたPuTTY ユーザーマニュアル主に PuTTY のパネルに関するドキュメントと、エラー メッセージや接続に関するドキュメントが多数見つかりました。第3.3章「文字セットの設定の変更」について説明していますが、主に非ラテンアルファベットに関するもので、第4.10章、翻訳パネルです。
私の質問は単純です、PuTTY は、\0 文字を受け取る必要があるときに通常何を行いますか? 受信しないのですか? 文字は受信しますが、ターミナルには表示されませんか?
さらに詳しい情報が必要な場合はお知らせください。
PuTTY にデータを送信するために使用されるコードは、STM32 ボード上の C です。
static int8_t CDC_Receive_FS(uint8_t* Buf, uint32_t *Len)
{
/* USER CODE BEGIN 6 */
USBD_CDC_SetRxBuffer(&hUsbDeviceFS, &Buf[0]);
USBD_CDC_ReceivePacket(&hUsbDeviceFS);
memset (buffer, '\0', 64); // clear the buffer
uint8_t len = (uint8_t)*Len; //Converts Len as uint32_t to len as uint8_t
memcpy(buffer, Buf, len); // copy the data to the buffer
memset(Buf, '\0', len); // clear the Buf also
//Code used to send message back
/*In the full version, there will be another function outside of this file.
* The buffer will be processed and a proper message will be sent.
* Check that other file to see how it gets processed when we eventually implement it.
*/
uint8_t transmit_message[64] = "TOWST_FIRMV_REEEEEEE_27\r\n"; //Do we have \r\n?
//CDC_Transmit_FS(transmit_message, sizeof(transmit_message));
//HAL_GPIO_TogglePin(GPIOF, GPIO_PIN_10);
//message_Received(buffer, len);
process_Message(buffer, len);
return (USBD_OK);
/* USER CODE END 6 */
}
void process_Message(uint8_t* message, uint16_t Len){
HAL_GPIO_TogglePin(GPIOF, GPIO_PIN_10);
uint8_t* inputCmd[5];
uint8_t* inputMessage[8];
uint8_t outputCmd[5];
uint8_t outputData[8];
// strcpy((char*) inputCmd, (const char*)message + COMMAND_CHAR);
// strcpy((char*) inputMessage, (const char*)message + DATA_CHAR);
if (strcmp(inputCmd, "FIRMV") == 0){
memcpy(outputCmd, "FIRMV", COMMAND_LENGTH);
memcpy(outputData, "01050A00", DATA_LENGTH);
}
else{
memcpy(outputCmd, "REEEE", COMMAND_LENGTH);
memcpy(outputData, "99999999", DATA_LENGTH);
}
// message_Received(message, Len);
send_Message(outputCmd, outputData);
}
void send_Message(uint8_t* cmd, uint8_t* data){
uint8_t outputMessage[25] = "TOWST_"; //Size of array is for future uses.
strncpy((char*) outputMessage + 8, "FIRMV", 5);
CDC_Transmit_FS(outputMessage, sizeof(outputMessage));
}
//Expected output: 'TOWST_\0\0FIRMV' based on this post, which per my understanding suggests that strncpy will fill in unfilled memory with null chars. https://aticleworld.com/how-to-use-strncpy-and-how-to-write-your-own-strncpy