加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

Arduino EthernetServer read()仅在Serial初始化并打印读取字符

发布时间:2020-12-16 07:34:13 所属栏目:百科 来源:网络整理
导读:我有一个Arduino项目,我从网络服务器读取数据. 我有一个EthernetClient,它在回调函数中逐个字符地读取数据. 我的工作代码看起来像(只有相关部分): void setup() { Serial.begin(9600); ...}void loop() { char* processedData = processData(callback); //
我有一个Arduino项目,我从网络服务器读取数据.

我有一个EthernetClient,它在回调函数中逐个字符地读取数据.

我的工作代码看起来像(只有相关部分):

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

void loop() {
  char* processedData = processData(callback); // this is in a external lib
}

boolean callback(char* buffer,int& i) {
  ...

  if (Client.available()) {
    char c      = client.read();
    buffer[i++] = c;

    Serial.print(c);
  }

  ...
}

这没有任何问题(读取和处理数据),但当我删除Serial.begin(9600);和Serial.print(c);它停止工作,我不知道为什么?唯一改变的是char c没有打印.可能是什么问题呢?

解决方法

当看似无关的代码被改变时,回调函数改变其行为的一个常见原因是优化器相关的错误.

许多嵌入式编译器无法理解将在程序中调用回调函数(或中断服务例程).他们看不到对该函数的显式调用,然后假设它从未被调用过.

当编译器做出这样的假设时,它将优化由回调函数改变的变量,因为它无法在初始化点和访问点之间看到变量被程序改变.

// Bad practice example:

int x; 

void main (void)
{
  x=5;
  ...

  if(x == 0) /* this whole if statement will get optimized away,the compiler assumes that x has never been changed. */
  {
    do_stuff();
  }
}

void callback (void)
{
  x = 0;
}

当这个bug出现时,它几乎不可能找到,它可能会导致任何奇怪的症状.

解决方案是始终将main()和中断/回调/线程之间共享的所有文件范围(“全局”)变量声明为volatile.这使得编译器无法做出不正确的优化器假设.

(请注意,volatile关键字不能用于实现同步,也不能保证任何内存障碍.这个问题与这些问题没有丝毫关系!)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读