2012-02-18 36 views
7

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); 
} 
+0

Có phải C hoặc C++ không? Nếu C++, tại sao bạn không sử dụng 'std :: string'? –

+0

@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++. –

+1

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? –

Trả lời

9

Tôi rất vui khi giải quyết được giải pháp của riêng tôi nhưng lại thất vọng khi không thấy vấn đề tầm thường này sớm hơn nhiều. char theo mặc định là signed trong c + +, mà làm cho nó giữ phạm vi -128 đến 127. Tuy nhiên, chúng tôi đang mong đợi các giá trị ASCII là 0 đến 255. Do đó nó đơn giản như tuyên bố nó là unsigned char str[] và mọi thứ khác sẽ hoạt động. Silly tôi, Silly tôi.

Tuy nhiên, cảm ơn tất cả mọi người vì đã giúp tôi !!!

+0

Tôi đã có: D –

2

Bạn có chắc chắn nên kết thúc bằng '\ r' không? Khi nhập văn bản từ bàn điều khiển, phím trả về sẽ dẫn đến ký tự '\ n' (trên Linux) và không phải '\ r'

Kiểm tra lỗi còn thiếu trên hầu hết các chức năng (open(), fcntl(), v.v.). Có thể một trong các chức năng này không thành công. Để tìm hiểu cách kiểm tra lỗi đọc trang người đàn ông (ví dụ: man 2 open cho lệnh open(). Trong trường hợp open() trang người đàn ông giải thích nó trả về -1 khi nó không thể mở tệp/cổng. bạn đã viết:.

char str[] = {0x56, 0x45, 0x52, 0x0D}; 
write(tty_fd,str,strlen(str)); 

đó là sai strlen hy vọng một '\ 0' chuỗi chấm dứt mà str là rõ ràng không phải vì vậy bây giờ nó sẽ gửi dữ liệu của bạn và bất cứ điều gì có trong bộ nhớ cho đến khi nó thấy một '\ 0' bạn. cần thêm 0x00 vào mảng str của bạn.

+0

Tôi đồng ý, tôi đã không thực hiện những kiểm tra lỗi đó. Nhưng tôi không nghĩ rằng đó là nguyên nhân của vấn đề gây ra các lệnh hiện tại làm việc (có nghĩa là kết nối là tốt). Tuy nhiên, nó sẽ thực sự tốt đẹp nếu bạn có thể chỉ ra cho tôi nơi tôi nên làm việc kiểm tra - tất cả những IO cấp thấp là hoàn toàn mới với tôi, lần đầu tiên. về '\ r', tôi không nghĩ rằng đó là vấn đề, gây ra tôi thậm chí thử nghiệm mã sau đây và nó vẫn trả về cùng một lỗi. 'char str [] = {'V', 0x45, 0x52, 0x0D}; write (tty_fd, str, strlen (str)); '.. và cũng có thể, tôi đã kiểm tra trên bảng ASCII rằng' 0x0D' chính xác là '\ r' –

+0

và cho mục đích thử nghiệm, tôi cũng đã thử' \ n', cũng không hoạt động. –

+0

OK, bạn cần dừng xem mã ngay bây giờ. Kết nối cổng nối tiếp của bạn với cổng khác trên một hộp khác và sử dụng ứng dụng đầu cuối để đọc nội dung đang được gửi trong cả hai trường hợp này (sẽ giống nhau nhưng không được). –

Các vấn đề liên quan