Tôi biết câu hỏi này nằm rải rác trên internet, nhưng vẫn còn, không có gì là nhận được tôi hoàn toàn ở đó. Tôi muốn ghi dữ liệu vào một cổng nối tiếp trong C++ (linux) cho một bảng Propeller. Chương trình hoạt động tốt khi lấy đầu vào từ giao diện điều khiển, nhưng khi tôi viết chuỗi nó luôn luôn trả về: ERROR - Invalid command
từ thiết bị. Tôi đã thử tạo mảng char
với giá trị Hex sau đó nó hoạt động. đây là một mã hoạt động, bên dưới. Nhưng làm thế nào tôi sẽ có thể chỉ cần cung cấp một biến chuỗi lệnh và gửi nó vào cổng nối tiếp? có lẽ, làm cách nào để tôi chuyển đổi nó thành giá trị hex nếu đó là cách duy nhất? Cảm ơn mọi ngườiViết STRINGS vào cổng nối tiếp trong C++ linux
lưu ý: vòng lặp là sử dụng đầu vào của người dùng từ bảng điều khiển. Những gì tôi cần là một cách để gửi một biến chuỗi vào cổng nối tiếp.
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <termios.h>
int main(int argc,char** argv){
struct termios tio;
struct termios stdio;
int tty_fd;
fd_set rdset;
unsigned char c='D';
printf("Please start with %s /dev/ttyS1 (for example)\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;
tty_fd=open(argv[1], O_RDWR | O_NONBLOCK);
cfsetospeed(&tio,B115200); // 115200 baud
cfsetispeed(&tio,B115200); // 115200 baud
tcsetattr(tty_fd,TCSANOW,&tio);
//char str[] = {'V','E','R','\r'};
//the above str[] doesn't work although it's exactly the same as the following
char str[] = {0x56, 0x45, 0x52, 0x0D};
write(tty_fd,str,strlen(str));
if (read(tty_fd,&c,1)>0)
write(STDOUT_FILENO,&c,1);
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
if (read(STDIN_FILENO,&c,1)>0)
if(c!='q')
write(tty_fd,&c,1); // if new data is available on the console, send it to the serial port
}
close(tty_fd);
}
Có phải C hoặc C++ không? Nếu C++, tại sao bạn không sử dụng 'std :: string'? –
@BasileStarynkevitch: Tôi đã thử làm điều đó: 'std :: string str =" VER \ r "; write (tty_fd, str.data(), str.size()); 'nó vẫn trả về lỗi. Tôi đã thử nhiều cách nhưng chỉ những công trình hex đó. bạn còn ý kiến nào không? Mã này là từ C, nhưng chương trình của tôi thực sự là C++. –
Có phải tôi, hoặc bạn đã không nói với chúng tôi những gì lỗi thực sự nói? –