找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3162|回复: 10
打印 上一主题 下一主题
收起左侧

单片机串口通信协议怎么写 求帮助

[复制链接]
跳转到指定楼层
楼主
ID:564822 发表于 2019-6-17 17:24 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
计算机从串口发送自己的学号(十六进制),单片机收到后,如果和自己的学号比较相等,则延时100ms后应答0xAA,如果不是自己的学号,则应答0x55;

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:552614 发表于 2019-6-17 21:46 | 只看该作者
先把串口初始化,然后定义一个串口中断函数,把自己的学号定义为宏,把接受到的数赋给一个变量,用if语句判断是不是等于,如果是延时发送0xAA,不是就发送0x55.
回复

使用道具 举报

板凳
ID:207421 发表于 2019-6-17 21:57 | 只看该作者
这论坛 伸手党 还真不少
百度的答案比论坛快多了
回复

使用道具 举报

地板
ID:517466 发表于 2019-6-17 22:17 | 只看该作者
楼主口中的协议,是不是指上层协议。基本的串口协议就是9600,n,8,1之类的。你想要的,需要自己建立一个协议,组织代码实现。你可以根据学号的长度,声明一个串口接收数据的缓冲区,长度要超过学号的长度。当串口收到某个特殊字符的时候,认为来自上位机的串口数据已经发完整了,然后下位机去对接收缓冲区的数据进行检查。基本思路就是这样。
回复

使用道具 举报

5#
ID:517466 发表于 2019-6-17 22:21 | 只看该作者
我建议还是采用ASCII+特殊字符的方式发送学号,避免数据干扰,比如学号使用特殊字母数字,加上校验数据,最后是发送结束标志(比如\0字符)。这样做虽然麻烦,但数据收发比较稳妥。你可以参考工业用到的一种串口协议MODBUS。
回复

使用道具 举报

6#
ID:123289 发表于 2019-6-18 08:30 | 只看该作者
协议:就是一份双方约定共同遵守合同。只要双方能共同遵守,怎么写都可以。
如果你个性强,不必与别人相同。
回复

使用道具 举报

7#
ID:772750 发表于 2020-6-8 13:27 来自手机 | 只看该作者
请问这个实验你有做出来吗
回复

使用道具 举报

8#
ID:772750 发表于 2020-6-8 13:28 来自手机 | 只看该作者
计算机从串口发送自己的学号(十六进制),单片机收到后,如果和自己的学号比较相等,则延时100ms后应答0xAA,如果不是自己的学号,则应答0x55;
回复

使用道具 举报

9#
ID:773058 发表于 2020-6-8 20:24 | 只看该作者
你可以拿本单片机的书先看一下,不要把它想得多复杂,几个例子就明白了
回复

使用道具 举报

10#
ID:715652 发表于 2020-6-8 22:08 | 只看该作者
师兄,你的16进制,具体指的啥?
回复

使用道具 举报

11#
ID:715652 发表于 2020-6-8 22:21 | 只看该作者
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define ID    0xf2    //不知道学号是不是这个样子?
int code DATA[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};  //CA12Ñô¶ÎÂë
void DelayMs(int x)  //Ñóê±
{
        int i;
        while(x--)        for(i=0;i<120;i++);
}
double pow(int a,int b)  //Ö¸êyÔËËã
{
        double y=1;
        if(b==0)        return y;
        while(b--)        y*=a;
        return y;
}
void Trasmit(uchar a)  //·¢Ëíêy¾Y
{
        SBUF=a;
        while(!TI);  //μè′y·¢Ëííê3é
        TI=0;
}
void init()
{
        IE=0xa0;  //¿a′®¿úoíT0ÖD¶Ï
        TI=RI=0;
        SCON=0x50;   //′®¿ú·½ê½1,RENÖÃ1ÔêDí½óêÕ
        PCON=0x00;    //2¨ìØÂê2»±¶Ôö
        TMOD=0x20;   //T0¶¨ê±·½ê½0oíT1¶¨ê±·½ê½2
        TH1=0xfd;
        TR1=1;  //¿aÆô¶¨ê±Æ÷
}
void main()
{
        init();
        while(1);
}
void RS_inter() interrupt 4   //PC·¢à′μÄêy¾Y′|àí
{
        if(RI)
        {
                if(SBUF==ID)        DelayMs(100),Trasmit(0xAA);
                else        Trasmit(0x55);
        }
}
/*不知道对不对*/
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表