我正在编写一个c程序,它在Raspberry PI(Debian Wheezy)和调制解调器之间建立串行通信。该程序到目前为止工作,但我希望输出也重定向到.txt或.csv文件。
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <termios.h>
#define MODEM "/dev/ttyUSB0"
#define BAUDRATE B9600
int main(int argc,char** argv)
{
struct termios tio;
struct termios stdio;
struct termios old_stdio;
int tty_fd, flags;
unsigned char c='D';
tcgetattr(STDOUT_FILENO,&old_stdio);
printf("Starte bitte %s /dev/ttyUSB0\n",argv[0]);
memset(&stdio,0,sizeof(stdio));
stdio.c_iflag=0;
stdio.c_oflag=0;
stdio.c_cflag=0;
stdio.c_lflag=0;
stdio.c_cc[VMIN]=1;
stdio.c_cc[VTIME]=0;
tcsetattr(STDOUT_FILENO,TCSANOW,&stdio);
tcsetattr(STDOUT_FILENO,TCSAFLUSH,&stdio);
fcntl(STDIN_FILENO, F_SETFL, O_NONBLOCK); // make the reads non-blocking
memset(&tio,0,sizeof(tio));
tio.c_iflag=0;
tio.c_oflag=0;
tio.c_cflag=CS8|CREAD|CLOCAL; // 8n1, see termios.h for more information
tio.c_lflag=0;
tio.c_cc[VMIN]=1;
tio.c_cc[VTIME]=5;
if((tty_fd = open(MODEM , O_RDWR | O_NONBLOCK)) == -1){
printf("Error while opening\n"); // Just if you want user interface error control
return -1;
}
cfsetospeed(&tio,BAUDRATE);
cfsetispeed(&tio,BAUDRATE); // baudrate is declarated above
tcsetattr(tty_fd,TCSANOW,&tio);
while (c!='q'){
if (read(tty_fd,&c,1)>0){
write(STDOUT_FILENO,&c,1); // if new data is available on the serial port, print it out
printf("");
}
if (read(STDIN_FILENO,&c,1)>0){
write(tty_fd,&c,1);//if new data is available on the console, send it to serial port
printf("");
}
}
close(tty_fd);
tcsetattr(STDOUT_FILENO,TCSANOW,&old_stdio);
return EXIT_SUCCESS;
}
希望有人可以帮助我
答案 0 :(得分:1)
为什么不在你的程序之外这样做呢?
以下内容将程序的(std)输出写入文件foo.txt
:
./myprogram > foo.txt
如果您还想查看输出,请通过tee
(将其stdin写入stdout 和文件)来管道输出
./myprogram | tee foo.txt
如果您完全确定要在程序中执行所有这些操作,则可能需要编写自己的write
函数,该函数会同时写入stdout
和文件。
ssize_t mywrite(int fd, const void *buf, size_t count) {
write(fd, buf, count);
return write(STDOUT_FILENO, buf, count);
}
然后使用它,而不是write
(请注意,您应该将打开文件的filedescriptor传递给mywrite
;它也写入STDOUT)
答案 1 :(得分:0)
目前尚不清楚为什么你不只是open()
一条新路径而是write()
而不是写入stdout。如果这不是一个选项(它似乎是一个选项,在示例代码中是最好的选项),则可以使用此伪代码执行运行时重定向。
#include <unistd.h>
// first open the new output path
int new_out = open("/path/to/output", flags_as_needed);
// next, move the standard output path
int save_out = dup(STDOUT_FILENO);
close(STDOUT_FILENO);
// now copy the new output path to the standard output position
dup2(STDOUT_FILENO, new_out);
答案 2 :(得分:0)
只需打开一个文件并使用其文件描述符:
#include <unistd.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
int main()
{
char block[1024]; //buffer of data
int out; //file deccriptor
int nread; //size of data
out = open("file.out", O_WRONLY|O_CREAT, S_IRUSR|S_IWUSR);
write(out,block,nread);
exit(0);
}