Read/write into a device in C++
How can I read/write to a device in C++? the device is in /dev/ttyPA1
.
/dev/ttyPA1
. If the device has something to write back it will read it from the device and write to screen. If not it will give the user prompt to write to the device again.
How can I do this?Use open(2)
, read(2)
, and write(2)
to read from and write to the device (and don't forget to close(2)
when you're done). You can also use the C stdio functions (fopen(3)
and friends) or the C++ fstream classes, but if you do so, you almost definitely want to disable buffering (setvbuf(3)
for stdio, or outFile.rdbuf()->pubsetbuf(0, 0)
for fstreams).
These will all operate in blocking mode, however. You can use select(2)
to test if it's possible to read from or write to a file descriptor without blocking (if it's not possible, you shouldn't do so). Alternatively, you can open the file with the O_NONBLOCK
flag (or use fcntl(2)
to set the flag after opening) on the file descriptor to make it non-blocking; then, any call to read(2)
or write(2)
that would block instead fails immediately with the error EWOULDBLOCK
.
For example:
// Open the device in non-blocking mode
int fd = open("/dev/ttyPA1", O_RDWR | O_NONBLOCK);
if(fd < 0)
; // handle error
// Try to write some data
ssize_t written = write(fd, "data", 4);
if(written >= 0)
; // handle successful write (which might be a partial write!)
else if(errno == EWOULDBLOCK)
; // handle case where the write would block
else
; // handle real error
// Reading data is similar
You can use fstream
, but you're going to have to look up the specifications for how your device would like to receive data. Some devices will be just fine using ASCII data, other devices will need a specific binary sequence of data bits/bytes. You may also have to write custom serialization objects that overload the operator<<
and operator>>
functions for the data you're trying to write. Either that, or you could use the read()
and write()
methods to read/write raw binary data from/to buffer arrays you've allocated in your program.
Edit: if you're concerned about blocking behavior, then you have two choices. You will either have to use the POSIX API, and check your opened file-descriptor with either poll()
or select()
to see if data is available, or you will have to keep any file-writing or reading calls in a set of separate threads that can basically act as asynchronous read/write actions. So you would basically send a message to the reader/writer thread, and that thread would block if needed on the fstream
calls, yet the rest of your program could continue to function. Your program though may not be designed for threads, and if that's the case, then the POSIX API would be the only way to-go.
精彩评论