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

来源:互联网 发布:中国网络经纪人头像 编辑:程序博客网 时间:2024/05/22 10:58

  在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端(使用keil2)发送:

#include<reg52.h>#define uchar unsigned  char#define uint unsigned intuchar  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端要多出一个中断处理程序。

(以前弄过的一个测试,现在发出来。。没啥技术含量,高手勿笑)













原创粉丝点击