0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

51单片机与串口通信的源代码详细概述

Wildesbeast 来源:单片机教程网 作者:单片机教程网 2020-06-13 11:13 次阅读

1. 发送:向总线上发命令

2. 接收:从总线接收命令,并分析是地址还是数据。

3. 定时发送:从内存中取数并向主机发送。

经过调试,以上功能基本实现,目前可以通过上位机单片机进行实时控制。

程序如下:

//这是一个单片机C51串口接收(中断)和发送例程,可以用来测试51单片机的中断接收

//和查询发送,另外我觉得发送没有必要用中断,因为程序的开销是一样的

#i nclude 《reg51.h》

#i nclude《stdio.h》

#i nclude 《string.h》

#define INBUF_LEN 4 //数据长度

unsigned char inbuf1[INBUF_LEN];

unsigned char checksum,count3 , flag,temp,ch;

bit read_flag=0;

sbit cp=P1^1;

sbit DIR=P1^2;

int i;

unsigned int xdata *RAMDATA; /*定义RAM地址指针*/

unsigned char a[6] ={0x11,0x22,0x33,0x44,0x55,0x66} ;

void init_serialcomm(void)

{

SCON=0x50; //在11.0592MHz下,设置串行口波特率为9600,方式1,并允许接收

PCON=0x00;

ES=1;

TMOD=0x21; //定时器工作于方式2,自动装载方式

TH0=(65536-1000)%256;

TL0=(65536-1000)/256;

TL1=0xfd;

TH1=0xfd;

ET0=1;

TR0=1;

TR1=1;

// TI=0;

EA=1;

// TI=1;

RAMDATA=0x1F45;

}

void serial () interrupt 4 using 3

{

if(RI)

{ RI=0;

ch=SBUF;

TI=1; //置SBUF空

switch(ch)

{

case 0x01 :printf(“A”); TI=0;break;

case 0x02 :printf(“B”); TI=0;break;

case 0x03 :printf(“C”); TI=0;break;

case 0x04 :printf(“D”); TI=0;break;

default :printf(“fg”); TI=0;break;

}

}

}

//向串口发送一个字符

void timer0() interrupt 1 using 3{

// char i;

flag++;

TH0=0x00;

TL0=0x00;

if(flag==10)

{// cp=!cp;

// for(i=0;i《6;i++)

P2=0x25;

TI=1;

temp=*RAMDATA;

printf(“%c”,temp);

TI=0;

// RAMDATA--;

flag=0;

}

}

//主程序

main()

{

init_serialcomm(); //初始化串口

//向6264中送数据

{

*RAMDATA=0x33;

}

while(1)

{

*RAMDATA=0x33;;

}

}

调试过程中遇到的问题:

1. 发送过程:在发送时必须保证TI=1:即发送缓冲器为空,否则将导致数据发不出去,如果想强制发送可以用:TI=1.具体发送数据:利用printf(“akjdfaklfj”);函数直接发送即可。

2. 接收过程:在接收时多选用中断方式,这样可以节约CPU的时间,提高效率,

1 Windows API通信函数方法

与通信有关的Windows API函数共有26个,但主要有关的有:

CreateFile() 用 “comn”(n为串口号)作为文件名就可以打开串口。

ReadFile() 读串口。

WriteFile() 写串口。

CloseHandle() 关闭串口句柄。

初始化时应注意CreateFile()函数中串口共享方式应设为0,串口为不可共享设备,其它与一般文件读写类似。以下给出API实

现的源代码。

1.1 发送的例程

//声明全局变量

HANDLE m_hIDComDev;

OVERLAPPED m_OverlappedRead, m_Over lappedWrite;

//初始化串口

void CSerialAPIView::OnInitialUpdate()

{

CView::OnInitialUpdate();

Char szComParams[50];

DCB dcb;

Memset(&m_OverlappedRead, 0, sizeof (OVERLAPPED));

Memset(&m_OverlappedWrite, 0, sizeof (OVERLAPPED));

m_hIDComDev = NULL;

m_hIDComDev = CreateFile(“COM2”, GENERIC_READ│GENERIC_WRITE, 0, NULL,

OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL│FILE_FLAG_OVERLAPPED, NULL);

if (m_hIDComDev == NULL)

{

AfxMessageBox(“Can not open serial port!”);

goto endd;

}

memset(&m_OverlappedRead, 0, sizeof (OVERLAPPED));

memset(&m_OverlappedWrite, 0, sizeof (OVERLAPPED));

COMMTIMEOUTS CommTimeOuts;

CommTimeOuts.ReadIntervalTimeout=0×FFFFFFFF;

CommTimeOuts.ReadTotalTimeoutMultiplier = 0;

CommTimeOuts.ReadTotalTimeoutConstant = 0;

CommTimeOuts.WriteTotalTimeoutMultiplier = 0;

CommTimeOuts.WriteTotalTimeoutConstant = 5000;

SetCommTimeouts(m_hIDComDev, &CommTimeOuts);

Wsprintf(szComparams, “COM2:9600, n, 8, 1”);

m_OverlappedRead. hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);

m_OverlappedWrite. hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);

dcb. DCBlength = sizeof(DCB);

GetCommState(m_hIDComDev, &dcb);

dcb. BaudRate = 9600;

dcb. ByteSize= 8;

unsigned char ucSet;

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 内存
    +关注

    关注

    8

    文章

    2767

    浏览量

    72753
  • 51单片机
    +关注

    关注

    269

    文章

    5648

    浏览量

    120693
  • 串口通信
    +关注

    关注

    32

    文章

    1577

    浏览量

    54860
收藏 人收藏

    评论

    相关推荐

    51单片机串口通信详细介绍-小白必看

    51单片机串口通信单片机与外部设备通信的重要方式,它基于串行
    的头像 发表于 04-17 09:33 113次阅读
    <b class='flag-5'>51</b><b class='flag-5'>单片机</b><b class='flag-5'>串口</b><b class='flag-5'>通信</b><b class='flag-5'>详细</b>介绍-小白必看

    基于51单片机的电子称设计源代码分享

    基于51单片机的电子称设计源代码
    发表于 09-26 08:10

    基于51单片机的多路开关控制小灯例程源代码

    基于51单片机的多路开关控制小灯例程源代码
    发表于 05-18 09:57 1次下载

    基于51单片机的表决器例程源代码例程

    基于51单片机的表决器例程源代码例程源代码
    发表于 05-18 09:54 0次下载

    基于51单片机的广告显示屏例程源代码

    基于51单片机的广告显示屏例程源代码
    发表于 05-18 09:52 0次下载

    基于51单片机串口发送1602液晶显示例程源代码

    基于51单片机串口发送1602液晶显示例程源代码
    发表于 05-16 11:53 3次下载

    基于51单片机的红外遥控舵机例程源代码

    基于51单片机的红外遥控舵机例程源代码
    发表于 05-16 11:16 14次下载

    基于51单片机的交通灯例程源代码

    基于51单片机的交通灯例程源代码
    发表于 05-16 11:14 18次下载

    基于51单片机的钟表(可定时)例程源代码

    基于51单片机的钟表(可定时)例程源代码
    发表于 05-16 11:10 0次下载

    基于51单片机的钟表(可矫正时间)例程源代码

    基于51单片机的钟表(可矫正时间)例程源代码
    发表于 05-16 11:09 0次下载

    基于51单片机的自制电压表源代码

    基于51单片机的自制电压表例程源代码
    发表于 05-12 16:29 3次下载

    基于51单片机的定时器例程源代码例程下载

    基于51单片机的定时器例程源代码例程源代码
    发表于 05-12 16:10 1次下载

    基于51单片机的占空比可调方波(PWM)例程源代码

    基于51单片机单片机产生占空比可调方波(PWM)例程源代码
    发表于 05-12 15:59 19次下载

    基于51单片机串口发送1602显示例程源代码

    基于51单片机串口发送1602显示例程源代码
    发表于 05-12 15:56 2次下载

    基于51单片机的表决器例程源代码

    基于51单片机的表决器例程源代码例程源代码
    发表于 05-12 15:55 1次下载