Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Compiler errors 错误:从‘;字符*’;至‘;char’;_Compiler Errors_Arduino - Fatal编程技术网

Compiler errors 错误:从‘;字符*’;至‘;char’;

Compiler errors 错误:从‘;字符*’;至‘;char’;,compiler-errors,arduino,Compiler Errors,Arduino,请耐心听我说,我是C的新手,我正在尝试编写一个Arduino。我想写一个程序,输出一个特定长度的数据帧,字节值在0-255之间。再现错误的最小代码在下面的代码块中。编译时,我收到以下错误: 现在我的印象是,我正在虐待“返回帧”,但我就是不知道出了什么问题 char assembleFrame() { char frame[] = { 0x61 , 0x62 , 0x63 }; return frame; } void setup() { Serial.begin( 1

请耐心听我说,我是C的新手,我正在尝试编写一个Arduino。我想写一个程序,输出一个特定长度的数据帧,字节值在0-255之间。再现错误的最小代码在下面的代码块中。编译时,我收到以下错误:

现在我的印象是,我正在虐待“返回帧”,但我就是不知道出了什么问题

char assembleFrame() {
  char frame[] = { 
    0x61 , 0x62 , 0x63
  };
  return frame;
}

void setup() {
  Serial.begin( 115200 );
};

void loop() {
  char frame = assembleFrame();
  Serial.print( frame );
}
在接收PC上运行hexdump时,我希望看到:

00000000  61 62 63                                          |abc|
00000003
我发现了很多类似的问题,但我无法找出我做错了什么

编辑: 这是我到目前为止提出的,但收到的数据是错误的。我想我正在用这个发送指向实际数据的指针

byte *assembleFrame() {
  byte frame[] = { 4 , 'a' , 'b' , 'c' };
  return frame;
}

void setup() {
  Serial.begin( 115200 );
};

void loop() {
  byte *frame = assembleFrame();
  Serial.write( frame , frame[ 0 ] );
}

assembleFrame
返回
char
,同时返回
char*
。因为我不知道你在做什么,我无法建议如何解决这个问题。也许修复返回类型是正确的方法。

查看以下代码:

char frame = assembleFrame();

考虑到您以后如何使用它,显然需要声明
frame
而不是
char
,并且
assembleeframe
需要声明为返回
char*

char
类型用于存储单个
char
(一个字节)

您的函数定义
char assembleFrame
指定函数将只返回单个
char
,因此当您尝试返回
char[]
/
char*
char
数组/指针)时,它将失败

看起来
Serial.print()
可以处理
char*
,这可能需要以null结尾(因为它不要求长度说明符)


这段代码经过编译,我知道我做错了什么,thnx。我输入的是
char*assembleFrame()
,而不是
char*assembleFrame()
。但是我现在有一个新问题:我不能使用以null结尾的字符串,因为有效负载可能包含null字节。固定大小没有问题。这容易解决吗?(在评论您的回复时,我还没有机会这样做,但现在就去做)。您可以一次向
Serial.write()
发送一个字节,这应该允许为空。可能需要
assembleFrame
将帧写入缓冲区(指向字符串的指针),并返回一个长度-然后您可以迭代缓冲区并
Serial.write()
每个
char
。是的,我在1秒前就找到了:)实际上您可以使用Serial.write(buf,len 0)传递一个长度参数
char frame = assembleFrame();
char *assembleFrame() {
  char frame[] = {
    0x61, 0x62, 0x63, 0x00 // null byte to signify end of string
  };
  return frame;
}

void setup() {
  Serial.begin( 115200 );
};

void loop() {
  char *frame = assembleFrame();
  Serial.print( frame );
}