c - 微控制器解释上的字符到 uint8 不正确?
问题描述
我正在做一个关于 SAME70 微控制器的项目。我需要从 char 转换为 uint8_t。我正在验证它是否正确执行此操作。
我注意到,当我运行此代码以打印出最终产品时:
char test[] = "hey this is a message from the MCU which I can make as large as I want it to be";
int main ( void )
{
/* Initialize all modules */
SYS_Initialize ( NULL );
USART1_Write((uint8_t*)test, sizeof((uint8_t*)test));
}
打印出来的数据不正确。只有第一个单词“嘿”被打印出来。但是,如果我这样做:
char test[] = "hey this is a message from the MCU which I can make as large as I want it to be";
uint8_t test2[79];
int sizedata = 0;
int main ( void )
{
/* Initialize all modules */
SYS_Initialize ( NULL );
sizedata = sizeof(test);
memcpy(test2,test,sizedata);
USART1_Write(test2, sizeof(test2));
转换工作正常,一切都被打印出来。在这两种情况下,我都给了它与输入相同的类型,所以在我看来,转换没有正确发生。有谁知道我在这里做错了什么?
解决方案
sizeof((uint8_t*)test)
是错的。这是指针的大小uint8_t*
。sizeof(test)
您应该改为传递数组的大小。
还
uint8_t test2[79];
sizedata = sizeof(test);
memcpy(test2,test,sizedata);
是错的。数组中的字符串test
长度为 79 个字符,因此该数组有 80 个元素,包括终止空字符,因此sizeof(test)
是 80 个。另一方面,目标test2
只有 79 个字节。因此,这memcpy
会执行危险的超出范围的访问。
你应该使用
uint8_t test2[sizeof(test)];
反而。或者如果你喜欢使用幻数(我不推荐这个),你应该写
sizedata = 79;
代替
sizedata = sizeof(test);