首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用stdio写入文件

用stdio写入文件
EN

Stack Overflow用户
提问于 2015-01-11 02:42:26
回答 4查看 1.3K关注 0票数 0

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

这是整个文件:

代码语言:javascript
复制
 /*
 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: %s\n", strerror (errno)) ;
    exit(1); //error
  }

  //setup GPIO in wiringPi mode
  if (wiringPiSetup () == -1){
    fprintf (stdout, "Unable to start wiringPi: %s\n", strerror (errno)) ;
    exit(1); //error
  }

}

void loop() {
  // Temperature every 3 seconds
  if(millis()-timeTemp>=3000){
    serialPuts (fd, "05\n");
    // 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, "06\n");
    // 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或文件的无效转换的错误。

我只需要将来自printf("%c", newChar);的数据写入一个文件中。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2015-01-11 02:48:27

fputc(&newChar, writeTemp);行中,您将获取一个指向您的字符的指针,将其转换为int,然后将其写入您的文件。你应该只写你的角色,就像fputc(newChar, writeTemp);。如果您喜欢printf,也可以使用fprintf(writeTemp, "%c", newchar);

票数 0
EN

Stack Overflow用户

发布于 2015-01-11 02:48:36

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

代码语言:javascript
复制
 fprintf(writeTemp, "%c", newChar);

另外,这条线

代码语言:javascript
复制
 char value = printf("%c", newChar);

没有意义,因为值被声明为char,但是从printf分配返回状态。

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

代码语言:javascript
复制
fputc(newChar, writeTemp);
票数 0
EN

Stack Overflow用户

发布于 2015-01-11 02:55:28

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

代码语言:javascript
复制
fputc(newValue, tempFile);

你应该可以走了。

祝你好运:)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27883451

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档