-4

我在使用 RS-232 从 linux OS 到 uc 8051 串行发送数据时遇到问题。8051 设置:

波特率 = 9600;
端口 = 端口 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

但是我有问题..所以请帮助我并告诉我linux通过rs-232发送数据的格式。也接收8051单片机的格式。需要 C 中的示例代码。

4

1 回答 1

0

我推荐基本的故障查找

  • 确保使用正确的电缆(2 和 3 被划掉,没有握手线开始)
  • 分离设备,即将您的 Linux 机器连接到运行终端程序的 PC 并尝试建立双向通信 - 使用 Linux/C 代码工作,直到您实现
  • 将您的 8051 连接到运行终端程序的 PC ....
  • 仅当 Linux 和 8051 都针对已知且经过验证的设备工作时才连接它们

如果您的 8051 代码示例代表所有代码 .... 8051 将如何响应 AT .... 它只能接收。

祝你好运

于 2012-06-21T13:11:01.487 回答