主题 : VM7.1 下Ubuntu10.10  与 51单片机的串口通信实验 复制链接 | 浏览器收藏 | 打印
级别: 侠客
UID: 40508
精华: 1
发帖: 44
金钱: 270 两
威望: 54 点
综合积分: 108 分
注册时间: 2011-03-19
最后登录: 2018-04-21
楼主  发表于: 2011-04-20 20:26

 VM7.1 下Ubuntu10.10  与 51单片机的串口通信实验

在VM7.1下给虚拟机增加一个串口(使用物理串口),注意此时在虚拟机中是串口1。

linux端程序(接收):
#include     <stdio.h>      /*标准输入输出定义*/
#include     <stdlib.h>     /*标准函数库定义*/
#include     <unistd.h>     /*Unix 标准函数定义*/
#include     <sys/types.h>  
#include     <sys/stat.h>  
#include     <fcntl.h>      /*文件控制定义*/
#include     <termios.h>    /*PPSIX 终端控制定义*/
#include     <errno.h>      /*错误号定义*/

#define        BAUDRATE        B9600            
#define        MODEMDEVICE    "/dev/ttyS1"

int main()
{
    int fd,c=0,res;
    struct termios oldtio,newtio;
    int  ch;
    static char s1[20],buf[19];

    printf("start ...\n");
/*打开PC的COM1口*/
    fd = open(MODEMDEVICE,O_RDWR|O_NOCTTY);
    if (fd == -1 )
    {
        perror(MODEMDEVICE);
        exit(1);
    }
    printf("open...\n");

    /*将旧的通讯参数存入oldtio结构*/
    tcgetattr(fd,&oldtio);

    /*初始化新的newtio */
    bzero((char*)&newtio,sizeof(newtio));

    /*8N1*/
    newtio.c_cflag = BAUDRATE|CS8|CLOCAL|CREAD;
    newtio.c_iflag = IGNPAR;
    newtio.c_oflag = 0;

    /*正常模式*/
    /*newtio.c_lflag = ICANON;*/

    /*非正常模式*/
    newtio.c_lflag = 0;
    newtio.c_cc[VTIME] = 0;
    newtio.c_cc[VMIN] = 10;

    tcflush(fd,TCIFLUSH);

    /*新的temios作为通讯端口参数*/
    tcsetattr(fd,TCSANOW,&newtio);
    printf("writing...\n");

    res = read(fd,buf,10);
        
    printf("%s\n",buf);

    printf("close...\n");
    /*还原旧参数*/
    tcsetattr(fd,TCSANOW,&oldtio);

    close(fd);
    return 0;
}

51端(使用kerl2)发送:
#include<reg52.h>
#define uchar unsigned  char
#define uint unsigned int

uchar  code trdata[]={'R','I','C','H','M','C','U','R','Z','-','5','1','V','2','.','0',0x0d,0x0a,0x00};
sbit K1=P3^2; //对应开发板K1按键
/*-------------------------------------------------------------*/


//串口初始化
void UART_Init(void)
{
    SCON = 0x40; //串口工作方式为1

    TMOD = 0x20; //定时器1 工作在方式2
    //PCON = 0x80; //SMOD = 1; 波特率加倍
    TH1 = 0xfd; //波特率 9600bps fosc="11".0592MHz
    TL1 = 0xfd;
     TR1 = 1; //允许定时器1工作
     EA = 1; //开总中断
}



void delay1ms(uint i)
{
    uchar j;
     while(i--)
     {
         for(j=0;j<115;j++)      //1ms基准延时程序
         ;
     }
}



/*-------------------------------------------------------------*/
//串口发送一个字符串
void Uart_SendString()
{    
    uchar i=0;
        while(trdata!=0x00)
    {    
        SBUF=trdata;
              while(!TI);
              TI=0;
              i++;
        }
}




/*-------------------------------------------------------------*/
//主函数
void main(void)
{
    UART_Init(); //初始化串口
    while(1)
    {
        if(K1==0)
        {
            delay1ms(20);
            if(K1==0)
            {
                Uart_SendString(); //发送数据
                while(!K1);    //等待按键释放
            }
        }
    }
}

linux发51接收的差不多,只是51端要多出一个中断处理程序。

级别: 新手上路
UID: 44782
精华: 0
发帖: 27
金钱: 135 两
威望: 27 点
综合积分: 54 分
注册时间: 2011-04-28
最后登录: 2017-09-13
1楼  发表于: 2011-07-12 14:21

 Re:VM7.1 下Ubuntu10.10 与 51单片机的串口通信实验

恩,学到点。

楼主,有没有linux发送后由51返回一个指令(自定义)。
我在试着写这样的,不过我在linux怎么接收后都不能正常显示,只能用串口助手以十六进制显示才行。
你有碰到这种情况吗