Thông báo

Collapse
No announcement yet.

Truyền thông nối tiếp rs232

Collapse
X
 
  • Lọc
  • Giờ
  • Show
Clear All
new posts

  • Truyền thông nối tiếp rs232

    Em chào bác.

    Em đang làm cái mạch giao thông . Em muốn hỏi về rs232(usart) . Em đã thiết lập usart cho phép ngắt khi có kí tự gửi đến và gửi đi. Em có hàm sau:
    int capnhat(void){
    char x = getchar();
    char k = x-48;
    switch(k){
    case '1':
    case '2':
    case '3':
    case '4':
    case '5':
    case '6': putchar(x); break;
    default: putchar(0); return 0;
    }
    return 1;
    }

    trong main() của em:
    while(1){
    capnhat();
    PORTA = 0xff;

    }
    Em thấy sau khi em gõ 1 kí tự từ terminal gửi về thì PORTA mới làm đèn sáng => hàm trong capnhat() là đợi ở câu lênh getchar();
    các bác ơi có cách nào để hàm này xác định có truyền kí tự thì làm ( qua interrupt) còn không sẽ nhẩy làm lệnh dưới không anh. Để vi điều khiển không phải đợi cho đến khi có phím gõ
    Mong chỉ giáo

  • #2
    Chắc bạn đang viết bằng Codevision AVR phải ko?
    Đây là 1 nhược điểm trong Codevision như bạn đã nói. Mình ko biết mọi người dùng cách nào nhưng theo kinh nghiem mình đã từng làm như sau:chế biến lại 1 chút hàm truyền getchar() tạo sẳn trong Codevision:

    Nguyên mẫu:
    char getchar(void)
    {
    char data;
    while (rx_counter==0);
    data=rx_buffer[rx_rd_index];
    if (++rx_rd_index == RX_BUFFER_SIZE) rx_rd_index=0;
    #asm("cli")
    --rx_counter;
    #asm("sei")
    return data;
    }

    Biến đổi:

    bit error_flag=0;
    char getchar(void)
    {
    char data;
    unsigned int count=0;

    while (rx_counter==0) {if(count++==5000) {error_flag=1;goto out;}}
    error_flag=0;
    data=rx_buffer[rx_rd_index];
    if (++rx_rd_index == RX_BUFFER_SIZE) rx_rd_index=0;
    #asm("cli")
    --rx_counter;
    #asm("sei")
    return data;
    out:
    }

    trong hàm bạn thực hien thi thế nầy:
    {
    ....
    a=getchar();
    ì(error_flag==0)
    {
    //do something with a variable
    ..........
    }
    ..........
    }

    Hàm getchar() bi đứng tai chổ nếu ko có nhận vào dử liệu là do vòng lặp while(). Để khăc phục mình cho 1 biến đếm count vào, nếu đếm hơn N lần (trong ví du la 5000 lần) thi tự đông thoát ra khỏi hàm getchar(), đồng thời kéo cờ errror_flag lên 1. Trong chương trình của bạn thi bạn sẽ xét bit error_flag nầy, nếu =0 thì bạn biết là có dữ liệu cần xừ lý, ngược lại thì ko có dữ liệu nhập vào.Lưu ý là bạn phải thực nghiêm nhiều lần để tìm ra giá trị N sao cho hoạt đông nhận dữ liệu là tốt nhất.
    Vài dòng đến bạn,
    Thân mến
    Last edited by zinix; 01-05-2009, 09:24.

    Comment


    • #3
      Em thấy sau khi em gõ 1 kí tự từ terminal gửi về thì PORTA mới làm đèn sáng => hàm trong capnhat() là đợi ở câu lênh getchar();
      các bác ơi có cách nào để hàm này xác định có truyền kí tự thì làm ( qua interrupt) còn không sẽ nhẩy làm lệnh dưới không anh. Để vi điều khiển không phải đợi cho đến khi có phím gõ
      Mong chỉ giáo
      - Bản chất của hàm nhận getchar() của codevision là sử dụng phương pháp thăm dò (polling), tức là nó sẽ liên tục chờ trong hàm getchar cho đến khi nhận được một kí tự nào đó. Trong trường hợp nó chưa nhận được dữ liệu thì nó sẽ không thể thoát ra khỏi hàm getchar(). Để khắc phục thì có thể chế biến lại giống như bạn ở trên phân tích, tức là mình đặt một thời gian time out, nếu hết thời gian này mà chưa nhận được dữ liệu thì thoát khỏi hàm getchar();
      - Có 2 cách để nhận dữ liệu gửi đến là dùng hàm getchar (phương pháp thăm dò) và dùng ngắt. Trong mọi trường hợp nhận dữ liệu từ cổng COM, bạn nên dùng ngắt là tốt nhất, không nên dùng hàm getchar()

      Thân mến,
      For a better world

      Comment


      • #4
        Các bác cho em hỏi thế dùng ngắt trong uart thì làm như thế nào. Em đang muôn nhận 6 byte về nhưng mà em mới chỉ biết dung getchar() thôi. Mong các cao thủ chỉ giáo

        Comment

        Về tác giả

        Collapse

        daretofail87 Tìm hiểu thêm về daretofail87

        Bài viết mới nhất

        Collapse

        Đang tải...
        X