This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] 编译器/MSP430FR5969:写入在空字节时停止传输

Guru**** 2563870 points
Other Parts Discussed in Thread: MSP430FR5969

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/591481/compiler-msp430fr5969-fwrite-stops-transmitting-at-null-byte

部件号:MSP430FR5969

工具/软件:TI C/C++编译器

您好!

出于调试目的,我正在将二进制数据从MSP430FR5969写入Code Composer Studio的控制台。
我正在使用stdio-Library中的fwrite,将所有内容发送到stdout。

这种方法有效,但传输将在发送空字节(0x00)的位置中止。 正如我所知,这只是在使用fputs时的预期行为。 这是一个错误,还是我错了?

我可以使用以下代码重现此问题。 (要在控制台上获得任何输出,我在链接器选项中增加了系统堆栈):

/*
main.c
*使用fwrite通过stdout将二进制数据输出到Code Composer Studio的控制台,但在流中存在零字节(0x00)时失败并终止。
*预期结果:
*发送0x00时fwrite不应停止,通常只能通过fput完成。 因此,在以下示例
中,console-Output的长度应该相同*
*/
#include <stdio.h>
#include <MSP430.h>

#define BUFFERLEN 16
unsigned char buf[BUFFERLEN];

int main(void){
WDTCTL = WDTPW | WDTHOLD;	//停止看门狗计时器


int i=0;
int zeroBytePlace=0;
fwrite ("开始",1,6,stdout);
而(1){

	//使用0xFF初始化缓冲区,但使用0x00初始化一个字节
	对于(i=0;i<BUFFERLEN;i++){
		IF (I=zeroBytePlace)
			buf[i]=0x00;
		否则
			buf[i]=0xFF;
	}
	zeroBytePlace =(zeroBytePlace+1)%BUFFERLEN;

	//写入输出:问题:只写入缓冲区的第一部分。 在zeroBytePlace,它将停止
	fwrite (buf,1,buFFERLEN,stdout);
	fflush (stdout);



}
	
} 

我的编译器版本:
TI v 15.12 .4.LTS

此致,

Eiko

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    检查fwrite()的返回值以查看它是否为BUFFERLEN。 在errno是否有任何内容? 您使用什么来读取数据? 它是否会在'\0'上阻塞?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    哦,您的第一个fwrite()也发送了'\0'。 您发送5个字符“开始”和结尾'\0'。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    stdout是文本流。  但是,您使用fwrite向其写入二进制数据。  不管用。  

    谢谢,此致,

    -George

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    对于非标准流,这是要fopen的"mode"参数的用途;您需要以"WB"模式打开文件以获得二进制输出。 遗憾的是,我认为不可能在二进制模式下重新打开stdout,因为它写的是库。 另请参阅:
    stackoverflow.com/.../is-there-way-to-set-stdout-to-binary-mode
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    这对该系统是否重要? 对于UNIX变体,则不是。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    感谢您的回复。 我测试了fwrite的返回值,它总是BUFFERLEN。 因此Fwrite声称写入所有数据,并且没有问题。
    我无法确定计算机是否有\0问题,但我也告诉Code Composer将所有数据重定向到一个文件,这显示了相同的问题。

    最后,考古学家和George Mock的说法是正确的- stdout并不是为了获取二进制数据。 有人知道一种优雅的替代方法吗? 我喜欢这种无需使用UART即可轻松获取数据的方法。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您可以使用"WB"模式打开一个常规文件并写入该文件。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    记录如下:
    processors.wiki.ti.com/.../Tips_for_using_printf

    它明确指出:
    如果您打开的文件是二进制文件,请确保使用二进制模式(如“rb”)打开该文件。 如果您不这样做,并且文件包含带有'0'字节的数据,则RTS将错误地将该数据用于文件的结尾。 有关详细信息,请参阅本讨论中关于二进制数据处理的最后一段。 "