基于printf库的打印调试

在运行这个自带例子的时候,不知道大家是否遇到过没有打印结果没有的情况。

Thread[Thread-1,5,main]serial@/dev/ttyUSB0:115200: resynchronising
也就是上面这句话之后没有任何结果了。

#include "printf.h"
module TestPrintfC {
  uses {
    interface Boot;
  }
}
implementation {
    
  uint8_t dummyVar1 = 123;
  uint16_t dummyVar2 = 12345;
  uint32_t dummyVar3 = 1234567890;

  event void Boot.booted() {
      printf("Hi I am writing to you from my TinyOS application!!\n");
      printf("Here is a uint8: %u\n", dummyVar1);
      printf("Here is a uint16: %u\n", dummyVar2);
      printf("Here is a uint32: %ld\n", dummyVar3);
      printfflush();
  }

}

以上是源码中给的例子。

大家发现没有,所有打印的东西都是上电启动后打印一次就结束了。等你观察时候早就结束了,自然没有结果。

所以我改动了这个程序。

#include "printf.h"

configuration TestPrintfAppC{
}
implementation {
  components MainC, TestPrintfC, LedsC;
  components new TimerMilliC() as Timer0;

  TestPrintfC.Boot -> MainC;

  TestPrintfC.Timer0 -> Timer0;
  TestPrintfC.Leds ->LedsC;
}

以上是TestPrintfAppC的内容

#include "Timer.h" 
#include "printf.h"
module TestPrintfC {
  uses {
    interface Boot;
    interface Timer<TMilli> as Timer0;
    interface Leds;
  }
}
implementation {
    
  uint8_t dummyVar1 = 123;
  uint16_t dummyVar2 = 12345;
  uint32_t dummyVar3 = 1234567890;
    
void pprin(){
    printf("Hi I am writing to you from my TinyOS application!!\n");
      printf("Here is a uint8: %u\n", dummyVar1);
      printf("Here is a uint16: %u\n", dummyVar2);
      printf("Here is a uint32: %ld\n", dummyVar3);
      printfflush();
  }
  event void Boot.booted() {
    call Timer0.startPeriodic(1000);
      printf("Hi I am writing to you from my TinyOS application!!\n");
      printf("Here is a uint8: %u\n", dummyVar1);
      printf("Here is a uint16: %u\n", dummyVar2);
      printf("Here is a uint32: %ld\n", dummyVar3);
      printfflush();
  }
  event void Timer0.fired(){
       pprin();
       call Leds.led0Toggle();
  }
      
}

以上是TestPrintfC的内容。让第一个灯每隔1秒闪烁一次,并且打印一次内容。

然后输入

make telosb install  (注:笔者的是telosb节点)

然后输入

java net.tinyos.tools.PrintfClient -comm serial@/dev/ttyUSB0:telosb

结果出现,结束

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: WiringPiSerial本身并不支持直接使用printf函数输出调试信息。但是,可以通过重定向标准输出流的方式来实现printf函数输出到串口的功能。 具体实现方式如下: 1. 打开串口 ```c int fd = serialOpen("/dev/ttyS0", 9600); ``` 这里打开了串口设备 /dev/ttyS0,并设置波特率为9600。 2. 重定向标准输出流 ```c dup2(fd, STDOUT_FILENO); ``` 这里使用dup2函数将标准输出流(STDOUT_FILENO)重定向到串口设备文件描述符(fd)。 3. 输出调试信息 ```c printf("Hello, world!"); ``` 这里使用printf函数输出调试信息,实际上输出的内容会被重定向到串口设备。 4. 恢复标准输出流 ```c dup2(STDOUT_FILENO, fd); ``` 这里使用dup2函数将标准输出流恢复到原来的状态,避免影响其他输出。 5. 关闭串口 ```c serialClose(fd); ``` 这里使用serialClose函数关闭串口,释放资源。 需要注意的是,重定向标准输出流的方式可能会影响其他输出,因此建议在需要输出调试信息时再使用。同时,在实际使用中,需要根据具体的串口设备和通信协议进行相应的设置和调整,以确保数据的正确性和完整性。 ### 回答2: wiringPiSerial printf是wiringPi中的一个函数,用于在树莓派上通过串口打印输出。 使用wiringPiSerial printf时,首先要确保wiringPi已经正确安装并被编译。 该函数的用法十分简单,只需按照以下步骤进行操作: 1. 引入所需的头文件 #include <wiringPi.h> #include <wiringSerial.h> 2. 初始化wiringPi wiringPiSetup(); 3. 打开串口 int fd = serialOpen("/dev/ttyAMA0", 9600); 注:其中,"/dev/ttyAMA0"是串口设备的路径,根据实际情况进行修改,9600是串口通信的波特率,也可以根据需要进行调整。 4. 调用printf函数进行串口打印输出 serialPrintf(fd, "Hello, World!\n"); 注:其中,fd是打开的串口设备的文件描述符,"Hello, World!\n"是要打印输出的字符串,也可以根据需要进行修改。 5. 关闭串口 serialClose(fd); 通过以上步骤,就可以在树莓派上利用wiringPiSerial printf函数通过串口打印输出了。这对于进行串口通信的调试、数据传输等应用非常实用。 ### 回答3: wiringPiSerial printf 是一个基于WiringPi 的功能,用于通过串口进行数据的发送和接收操作。它支持使用 printf 函数格式化输出数据到串口。 首先,你需要在程序中包含 "wiringSerial.h" 头文件,并使用函数 serialPrintf 来发送数据。通过这个函数,将需要发送的数据以 printf 函数的格式进行写入,可以将不同类型的数据进行格式化处理,然后以字符串的形式发送到串口。 示例代码如下: #include <wiringSerial.h> int main() { int serial_port; if ((serial_port = serialOpen("/dev/ttyS0", 9600)) < 0) // 打开串口 { fprintf(stderr, "无法打开串口\n"); return 1; } // 待发送的数据 int number = 123; float temperature = 25.6; char message[20] = "Hello World"; // 将数据格式化为字符串并发送到串口 serialPrintf(serial_port, "数字:%d 温度:%.1f 信息:%s", number, temperature, message); serialClose(serial_port); // 关闭串口 return 0; } 上述代码以"/dev/ttyS0" 串口设备和波特率9600 初始化了一个新的串口连接。然后使用 serialPrintf 函数将 number、temperature 和 message 数据以 printf 函数的格式化形式发送到串口。最后关闭了串口连接。 通过使用 wiringPiSerial printf,你可以方便地通过串口发送不同类型的数据,这在很多应用场景中是非常有用的。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值