我在使用RS-232从Linux操作系统向uc 8051串行发送数据时遇到问题。
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语言编写示例代码。

最佳答案

我建议基本的故障查找


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


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

祝好运

关于c - 使用C语言中的rs-232在Linux和8051微 Controller 板之间进行串行通信,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11126257/

10-10 17:40