-4

Linux OS から uc 8051 に RS-232 を使用してシリアルでデータを送信する際に問題があります。8051 設定:

ボーレート = 9600;
comport = ポート 1。
パリティ = なし
ストップ ビット = 1

// my code for receiving data on 8051 uc
#include <reg51.h>

unsigned char value;
int i,j;

void ini()     
{
    TMOD=0x20;  //Timer1, mode 2, baud rate 9600 bps
    TH1=0XFD; 
    SCON=0x50;
    TR1=1;
}

void delay()
{
    for(i=0;i<=1000;i++)
    for (j=0;j<=300;j++);
}

void recieve() 
{
    unsigned char value;
    while(RI==0);
    value=SBUF;
    P1=value;
    RI=0;
}

void main()
{
    while(1)
    {
        ini();
        recieve();
    }
}

// and code which run on linux is as following
#include <stdio.h> // standard input / output functions
#include <string.h> // string function definitions
#include <unistd.h> // UNIX standard function definitions
#include <fcntl.h> // File control definitions
#include <errno.h> // Error number definitions
#include <termios.h> // POSIX terminal control definitionss
#include <time.h>   // time calls

int open_port(void)
{
    int fd; // file description for the serial port

    fd = open("/dev/ttyS0", O_RDWR | O_NOCTTY | O_NDELAY);

    if (fd == -1) // if open is unsucessful
    {
        //perror("open_port: Unable to open /dev/ttyS0 - ");
        printf("open_port: Unable to open /dev/ttyS0. \n");
    }
    else
    {
        fcntl(fd, F_SETFL, 0);
        printf("port is open.\n");
    }

    return(fd);
} //open_port

int configure_port(int fd)      // configure the port
{
    struct termios port_settings;      // structure to store the port settings in

    cfsetispeed(&port_settings, B9600);    // set baud rates
    cfsetospeed(&port_settings, B9600);

    port_settings.c_cflag &= ~PARENB;    // set no parity, stop bits, data bits
    port_settings.c_cflag &= ~CSTOPB;
    port_settings.c_cflag &= ~CSIZE;
port_settings.c_cflag |= CS8;

    tcsetattr(fd, TCSANOW, &port_settings);    // apply the settings to the port
    return(fd);

} //configure_port

int query_modem(int fd)   // query modem with an AT command
{
    char n;
    fd_set rdfs;
    struct timeval timeout;

    // initialise the timeout structure
    timeout.tv_sec = 10; // ten second timeout
    timeout.tv_usec = 0;

    // Create byte array
    unsigned char send_bytes[] = {  0x00, 0xff};

    write(fd, send_bytes, 2);  //Send data
    printf("Wrote the bytes. \n");

    // do the select
    n = select(fd + 1, &rdfs, NULL, NULL, &timeout);

    // check if an error has occured
    if(n < 0)
    {
        perror("select failed\n");
    }
    else if (n == 0)
    {
        puts("Timeout!");
    }
    else
    {
        printf("\nBytes detected on the port!\n");
    }
    return 0;
} //query_modem

int main(void)
{ 
    int fd = open_port();
    configure_port(fd);
    query_modem(fd);
    return(0);
} // main

しかし、私には問題があります.. plzは私を助けて、Linuxがrs-232を介してデータを送信する形式を教えてください。8051マイクロコントローラの受信フォーマットも。C のサンプル コードが必要です。

4

1 に答える 1

0

基本的な障害発見をお勧めします

  • 正しいケーブルを使用していることを確認してください (2 と 3 に取り消し線が引かれています。最初はハンドシェイク ラインはありません)。
  • デバイスを分離します。つまり、端末プログラムを実行している PC に Linux マシンを接続し、双方向通信の確立を試みます。達成するまで Linux / C コードで作業します。
  • 端末プログラムを実行している PC に 8051 を接続します ....
  • Linux と 8051 を接続するのは、どちらも既知の実証済みのデバイスに対して機能する場合のみです。

あなたの 8051 コード サンプルがすべてのコードを表している場合 .... 8051 は AT にどのように応答するでしょうか .... 受信のみが可能です。

幸運を

于 2012-06-21T13:11:01.487 に答える