linux和8051微控制器板之间使用rs-232进行串行通信

时间:2012-06-20 18:53:06

标签: c linux serial-port microcontroller embedded-linux

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

波特率= 9600;
comport = port1。
parity = none
停止位=一个

// 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中的示例代码。

1 个答案:

答案 0 :(得分:0)

我建议基本的错误发现

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

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

祝你好运