使用 stdio 写入文件
Writing to a file with 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: %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* 到 char 或到 FILE 的无效转换的错误。
我只需要将 printf("%c", newChar);
的数据写入文件即可。
在行 fputc(&newChar, writeTemp);
中,您将指针指向您的角色,将其转换为 int
,然后将其写入您的文件。你应该只写你的角色;类似于 fputc(newChar, writeTemp);
。或者 fprintf(writeTemp, "%c", newchar);
如果你喜欢 printf.
如果您想要类似 printf 的函数,请使用 fprintf
。
要将输出写入文件,您可以编写
fprintf(writeTemp, "%c", newChar);
此外,行
char value = printf("%c", newChar);
没有意义,因为值被声明为 char
但被分配了 return 状态 printf
.
正如另一个回复所指出的,fputc()
的参数也是错误的。你可以写
fputc(newChar, writeTemp);
fputc 接受一个整数,而不是地址。您遇到的问题是因为您正在传递 newChar 的地址。将代码更改为
fputc(newValue, tempFile);
你应该可以开始了。
祝你好运:)
使用 append 而不是 write 以某种方式解决了问题:
FILE * writeTemp = fopen("temp.txt", "a");
我还必须删除第二个请求:
/*
// Humidity every 3 seconds
if(millis()-timeHum>=3000){
serialPuts (fd, "06\n");
timeHum=millis();
}
// read signal
if(serialDataAvail (fd)){
char humChar = serialGetchar (fd);
printf("%c", humChar);
fflush(stdout);
}
*/
因为它出于某种原因干扰了数据,即使使用不同的 char 变量也是如此。
感谢您的回答。
我正在使用 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: %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* 到 char 或到 FILE 的无效转换的错误。
我只需要将 printf("%c", newChar);
的数据写入文件即可。
在行 fputc(&newChar, writeTemp);
中,您将指针指向您的角色,将其转换为 int
,然后将其写入您的文件。你应该只写你的角色;类似于 fputc(newChar, writeTemp);
。或者 fprintf(writeTemp, "%c", newchar);
如果你喜欢 printf.
如果您想要类似 printf 的函数,请使用 fprintf
。
要将输出写入文件,您可以编写
fprintf(writeTemp, "%c", newChar);
此外,行
char value = printf("%c", newChar);
没有意义,因为值被声明为 char
但被分配了 return 状态 printf
.
正如另一个回复所指出的,fputc()
的参数也是错误的。你可以写
fputc(newChar, writeTemp);
fputc 接受一个整数,而不是地址。您遇到的问题是因为您正在传递 newChar 的地址。将代码更改为
fputc(newValue, tempFile);
你应该可以开始了。
祝你好运:)
使用 append 而不是 write 以某种方式解决了问题:
FILE * writeTemp = fopen("temp.txt", "a");
我还必须删除第二个请求:
/*
// Humidity every 3 seconds
if(millis()-timeHum>=3000){
serialPuts (fd, "06\n");
timeHum=millis();
}
// read signal
if(serialDataAvail (fd)){
char humChar = serialGetchar (fd);
printf("%c", humChar);
fflush(stdout);
}
*/
因为它出于某种原因干扰了数据,即使使用不同的 char 变量也是如此。
感谢您的回答。