51单片机串口接收和发送数据

第一种方法:在中断中处理

typedef unsigned char         UINT8;
volatile  UINT8 u8Uart_Data;
void InitialUART0_Timer1()
{

    SCON = 0x50;        //2015-05-04
    TMOD = 0x20;

    TH1 = 0XFD;                              // 9600BPS     2015-05-04     wangrong
    TL1 = 0XFD;
    TR1 = 1;                               // start timer0
    ES = 1;                             // Enable serial interrupt
    EA = 1;                             // Enable global interrupt
}

//-----------------------------------------------------------------------------------------------------------
void main (void)
{

    //--------------------------------------------------------------------------------
    InitialUART0_Timer1();                   // 9600 Baud Rate @ 11.0592MHz

    while(1)
    {
         //    Receive_Data_From_PC();
        //Send_Data_To_PC(Receive_Data_From_PC());
        while(recv_data)
        {
            recv_data = 0;
            TI = 0;
            SBUF = u8Uart_Data;
        }

    }
}
//-----------------------------------------------------------------------------------------------------------
void UART_ISR(void) interrupt 4
{
    if (RI)
    {                                   // If reception occur
        RI = 0;                         // Clear reception flag for next reception
        u8Uart_Data = 0;
        u8Uart_Data = SBUF;             // Read receive data
        recv_data = 1;
        //SBUF = u8Uart_Data;           // Send back same data on UART
       }
    if (TI)                                // If emission occur
    {                                   // Clear emission flag for next emission
        TI = 0;
    }
}
//-----------------------------------------------------------------------------------------------------------

第二种方法:不在中断中处理

//-----------------------------------------------------------------------------------------------------------
// Use timer1 as baud rate generator
void InitialUART0_Timer1()
{

    SCON = 0x50;        //2015-05-04
    TMOD = 0x20;

#if 0

#ifdef FOSC_110592
    TH1 = 256 - (28800/u32Baudrate); /* 11.059M/384=28800 */
#endif
#ifdef FOSC_184320
    TH1 = 256 - (48000/u32Baudrate); /* 18.4320M/384=48000 */
#endif
#ifdef FOSC_221184
     TH1 = 256 - (57600/u32Baudrate); /* 22.1184M/384=57600 */
#endif
#ifdef FOSC_331776
     TH1 = 256 - (86400/u32Baudrate); /* 33.1776M/384=86400 */
#endif
#ifdef FOSC_368640
     TH1 = 256 - (96000/u32Baudrate); /* 36.8640M/384=96000 */
#endif

#endif /*    #if 0    */

    TH1 = 0XFD;                              // 9600BPS     2015-05-04     wangrong
    TL1 = 0XFD;
    TR1 = 1;                               // start timer0
    ES = 1;                             // Enable serial interrupt
    EA = 1;                             // Enable global interrupt
}
//-----------------------------------------------------------------------------------------------------------
UINT8 Receive_Data_From_PC(void)
{
    UINT8 c;

    while (!RI);
    c = SBUF;
    RI = 0;
    return (c);
}
//-----------------------------------------------------------------------------------------------------------
void Send_Data_To_PC (UINT8 c)
{
    while (!TI);
    TI = 0;
    SBUF = c;
}
//-----------------------------------------------------------------------------------------------------------

//-----------------------------------------------------------------------------------------------------------
void main (void)
{

    //--------------------------------------------------------------------------------

    InitialUART0_Timer1();                   // 9600 Baud Rate @ 11.0592MHz

    //---------------------------------------------------------------------------------

    while(1)
    {

         Receive_Data_From_PC();
        Send_Data_To_PC(Receive_Data_From_PC());
    }
}
时间: 2024-08-29 07:42:40

51单片机串口接收和发送数据的相关文章

51单片机串口通信

一.原理简介 51 单片机内部有一个全双工串行接口.什么叫全双工串口呢?一般来说,只能接受或只能发送的称为单工串行:既可接收又可发送,但不能同时进行的称为半双工:能同时接收和发送的串行口称为全双工串行口.串行通信是指数据一位一位地按顺序传送的通信方式,其突出优点是只需一根传输线,可大大降低硬件成本,适合远距离通信.其缺点是传输速度较低. 与之前一样,首先我们来了解单片机串口相关的寄存器. SBUF 寄存器:它是两个在物理上独立的接收.发送缓冲器,可同时发送.接收数据,可通过指令对SBUF 的读写

51单片机串口通信(字符串接收和发送)

1 #include<reg52.h> 2 3 //------------------串口通信协议-----------------// 4 /* 5 客户端数据包格式解释(长度恒为15): 6 例如:A01_fmq_01Off___# 7 A--------数据包的开始标记(可以为A到Z,意味着数据包可以有26种) 8 01-----设备代号 9 fmq_01Off___--------指令(长度恒为10),指令的前4个人字符是指令头部,指令的后6个字符是指令尾部 10 #--------

串口通信基础,接收,发送数据

通信接口背景知识 设备之间通信的方式 一般情况下,设备之间的通信方式可以分成并行通信和串行通信两种.它们的区别是: 串行通信的分类 1.按照数据传送方向,分为: 单工:数据传输只支持数据在一个方向上传输:    半双工:允许数据在两个方向上传输.但是,在某一时刻,只允许数据在一个方向上传输,它实际上是一种切换方向的单工通信:它不需要独立的接收端和发送端,两者可以合并一起使用一个端口.    全双工:允许数据同时在两个方向上传输.因此,全双工通信是两个单工通信方式的结合,需要独立的接收端和发送端.

深入理解51单片机串口通信

串口通信的基本认识 通信分为并行通信和串行通信,并行通信时的数据各个位同时传送,可以实现字节为单位通信,但通信线多占用资源,成本高.以前用到的的P1=0x55,一次给P1口的8个管脚分别赋值,同时进行信号输出,类似于8个车道可以过去8辆车,这样的形式是并行的,一般称P0,P1,P2,P3为51单片机的4组并行总线. 串行通信,就是一个车道,一个只能通过一辆车,如果一个0x55这样一个字节的数据要传输过去的话,假如低位在前,高位在后的话,那发送方式是:0-1-0-1-0-1-0-1,一位一位的进行

51单片机串口通信时的定时器设置的相关问题

51单片机在串口通信时需要有一个定时器去调节与计算机通信的波特率,而定时器设置时需要中断寄存器(IE), 定时器控制寄存器(TCON) ,还有T/C控制寄存器共同配合作用, 但在启动定时器功能时,这三个寄存器的配置顺序十分重要,因为在数据传输时的高速情况下,一点点的数据误差就会导致传输的数据出现错误.而在51单片机的串口通信时必须将配置TCON放在配置这三个寄存器的最后,因为在TCON中含有启动定时器的TR1和TR0位,若先启动后对工作方式和溢出率进行配置,就会导致启动时定时器根本无法像预先设定

Qt模拟串口-tcp连接发送数据

上一节已经基本上完成了qt界面的基本布局,下面就是后台数据的发送和接收了, 前面说了,qt和uc/os 交互使用的方式是tcp 为啥要用tcp,而不使用别的呢, udp:按道理udp是最好的,不用连接,想发就发,不用管端口.但是,qt这个鬼,他封装的udp函数不支持服务器下发数据,也就是udp的服务器不能下发数据,只能接收. 串口:既然是串口通讯,为啥不直接用串口呢.c语言对串口的支持太差了, 很不好用,qt到还好,找个插件就能完成, 所以最后就采用了tcp的传输方式,既可以收发,也可以同时对应

stm32串口接收完整的数据包

借鉴了文章:<stm32串口中断接收方式详细比较> 文章地址:http://blog.csdn.net/kevinhg/article/details/40186169 串口的配置这里不做说明,仅对中断中的协议解析进行描述 数据帧协议: 帧头1 帧头2 数据长度 有效数据 crc_1 crc_2 B5 5B 03 00 57 0B 帧头1+帧头2+数据长度(包含有效数据.crc_1.crc_2)+有效数据 + crc_1 + crc_2(校验为帧头到有效数据) crc16校验未深入学习,代码也

linux串口驱动分析——发送数据

一.应用程序中write函数到底层驱动历程 和前文提到的一样,首先先注册串口,使用uart_register_driver函数,依次分别为tty_register_driver,cdev_init函数,找到使用的file_operations,即应用程序与tty架构的统一接口.步骤不再赘述. static const struct file_operations tty_fops = { .llseek = no_llseek, .read = tty_read, .write = tty_wr

使用Socket类接收和发送数据

网络应用分为客户端和服务端两部分,而Socket类是负责处理客户端通信的Java类.通过这个类可以连接到指定IP或域名的服务器上,并且可以和服务器互相发送和接受数据.在本文及后面的数篇文章中将详细讨论Socket类的使用,内容包括Socket类基础.各式各样的连接方式.get和set方法.连接过程中的超时以及关闭网络连接等. 在本文中,我们将讨论使用Socket类的基本步骤和方法.一般网络客户端程序在连接服务程序时要进行以下三步操作. 1.连接服务器 2.发送和接收数据 3.关闭网络连接 一.连