C语言 使用 stdio 写入文件



我正在使用 wiringPi 库中的示例代码通过串行从 Arduino 读取数据到 Raspberry Pi,它使用 printf("%c", newChar); 正确显示数据,但我无法将相同的数据写入文本文件。

这是整个文件:

 /*
 Pi_Serial_test.cpp - SerialProtocol library - demo
 Copyright (c) 2014 NicoHood.  All right reserved.
 Program to test serial communication
 Compile with:
 sudo gcc -o Pi_Serial_Test.o Pi_Serial_Test.cpp -lwiringPi -DRaspberryPi -pedantic -Wall
 sudo ./Pi_Serial_Test.o
 */
// just that the Arduino IDE doesnt compile these files.
#ifdef RaspberryPi
//include system librarys
#include <stdio.h> //for printf
#include <stdint.h> //uint8_t definitions
#include <stdlib.h> //for exit(int);
#include <string.h> //for errno
#include <errno.h> //error output
//wiring Pi
#include <wiringPi.h>
#include <wiringSerial.h>
char device[]= "/dev/ttyAMA0";
// filedescriptor
int fd;
unsigned long baud = 9600;
unsigned long timeTemp=0;
unsigned long timeHum=0;
//unsigned long timeLight=0;
//unsigned long timeMotion=0;

//prototypes
int main(void);
void loop(void);
void setup(void);
void setup(){
  printf("%s n", "Raspberry Startup!");
  fflush(stdout);
  //get filedescriptor
  if ((fd = serialOpen (device, baud)) < 0){
    fprintf (stderr, "Unable to open serial device: %sn", strerror (errno)) ;
    exit(1); //error
  }
  //setup GPIO in wiringPi mode
  if (wiringPiSetup () == -1){
    fprintf (stdout, "Unable to start wiringPi: %sn", strerror (errno)) ;
    exit(1); //error
  }
}
void loop() {
  // Temperature every 3 seconds
  if(millis()-timeTemp>=3000){
    serialPuts (fd, "05n");
    // you can also write data from 0-255
    // 65 is in ASCII 'A'
    //serialPutchar (fd, 5);
    timeTemp=millis();
  }
  // read signal
  if(serialDataAvail (fd)){
    char newChar = serialGetchar (fd);
    FILE * writeTemp = fopen("temp.txt", "w");
    printf("%c", newChar);
    fputc(newChar, writeTemp);
    fflush(stdout);
    fclose(writeTemp);
    }

// Humidity every 4 seconds
  if(millis()-timeHum>=4000){
    serialPuts (fd, "06n");
    // you can also write data from 0-255
    // 65 is in ASCII 'A'
    //serialPutchar (fd, 5);
    timeHum=millis();
  }
  // read signal
  if(serialDataAvail (fd)){
    char newChar = serialGetchar (fd);
    //printf("received from ardiono n");
    printf("%c", newChar);
    fflush(stdout);
    }

  }
// main function for normal c++ programs on Raspberry
int main(){
  setup();
  while(1) loop();
  return 0;
}
#endif //#ifdef RaspberryPi

我尝试了不同的命令,但我不断收到从 const char* 到 char 或 FILE 的无效转换错误。

我只需要将printf("%c", newChar);中的数据写入文件即可。

在第 fputc(&newChar, writeTemp); 行中,您将一个指向角色的指针,将其转换为 int ,然后将其写入您的文件。 你应该只写你的角色;像fputc(newChar, writeTemp);. 或者fprintf(writeTemp, "%c", newchar);,如果你更喜欢printf。

fputc 采用 int,而不是地址。您遇到的问题是因为您正在传递 newChar 的地址。将代码更改为

fputc(newValue, tempFile);

你应该很高兴。

祝你好运:)

如果你想要一个类似 printf 的函数,请使用 fprintf .要将输出写入文件,您需要写入

 fprintf(writeTemp, "%c", newChar);

此外,该行

 char value = printf("%c", newChar);

没有意义,因为 value 被声明为char但被分配了来自 printf 的返回状态。

正如另一个答复所指出的,对fputc()的论点也是错误的。你可以写

fputc(newChar, writeTemp);

使用追加而不是写入以某种方式解决了这个问题:

FILE * writeTemp = fopen("temp.txt", "a");

我还必须删除第二个请求:

    /*
// Humidity every 3 seconds
  if(millis()-timeHum>=3000){
    serialPuts (fd, "06n");
    timeHum=millis();
  }
  // read signal
  if(serialDataAvail (fd)){
    char humChar = serialGetchar (fd);
    printf("%c", humChar);
    fflush(stdout);
    }
*/

因为它出于某种原因干扰了数据,即使使用不同的 char 变量也是如此。

谢谢你的回答。

相关内容

  • 没有找到相关文章

最新更新