历史上的今天
返回首页

历史上的今天

今天是:2026年03月24日(星期二)

正在发生

2023年03月24日 | 单片机下串口(UART)协议包接收程序

2023-03-24 来源:zhihu

代码编写在51单片机上,用于从接收缓冲区中提取有用数据(协议包)。基本逻辑亦可用于其他语言,其他情况下的接收程序。


数据的转移主要分了3步,接收缓冲区=》待处理数据=》有用数据。


接收缓冲区提取到待处理数据:由于可能下一个包马上就要过来,所以应把数据提取出来再做处理,以免直接处理的过程中收到新的数据造成混乱。


待处理数据提取到有用数据:例如在某些环境下,会收到其他协议的包(由其他程序处理),或者带有地址区分是否发给本机的包,所以需要设置一些条件来提取真正有用的数据。


单片机串口UART在接收中断程序中写入接收缓冲区,一定时间没有收到数据则标志为接收空闲(完成一个包的接收)。


本段代码先判断串口处于接收空闲状态,然后判断包太小则放弃,认为是错误包。


失能中断,把接收缓冲区提取出来后,重新使能中断,以尽快准备好接收下一次数据传输。


然后则开始搜索包头(帧头),然后把符合协议的部分提取出来,清空包头以免重复处理,最后解析该包。


int WaitingBuf(void)

{

    int return_err=5;

    uint8 bytecnt;

    uint8 i;    

    uint16 dest_p;

    uint16 ScanningAddr;

    uint8 buffer[RXBUFSIZE];//如果太小,收到数据CNT比他大,则程序崩溃    

    uint8 ReceiveBuf[20];

    

    if(rs_state==RS_IDLE)//uart中断接受处于空闲状态,表示一个包接受结束,利用一定时间内没有收到数据判断

    {        

        bytecnt=r_count;

        if(bytecnt<=5)//包太小,误传,错误包,电压不稳定等 

            return 3;

        UA_IER &= (~RDA_IEN | ~RLS_IEN);    //禁止中断,提取本次接收完成后,接受缓冲区的数据

        for(i=0;i        {

            buffer[i]=r_buf[i];

        }

        r_count=0;//让缓冲区重新从头开始储存

        UA_IER |= (RDA_IEN | RLS_IEN);   //使能中断,提取数据完毕,准备下一次接收数据

        for(ScanningAddr=0;ScanningAddr<(bytecnt-1);ScanningAddr++) //扫描数据

        {

            if(buffer[ScanningAddr] == 0xEF && buffer[ScanningAddr+1] == 0x01)//找到包头

            {

                for(dest_p=0;dest_p<(bytecnt-ScanningAddr);dest_p++)//从本次收到的数据中,提取有用的部分(符合协议的)

                {

                    ReceiveBuf[dest_p]=buffer[ScanningAddr+dest_p];    

                }

                buffer[ScanningAddr]=0;//清除包头,以免重复处理

                buffer[ScanningAddr+1]=0;

                return_err = ReceiveBufAnalysis(ReceiveBuf);//把收到的协议包送去处理

                break;//如果存在有1个以上数据包将快速发送过来的话,可能缓存区一次将包含2个有用的包,需要去掉该break;

            }

        }    

    }

    else 

        return_err = 2;

    return return_err;

}


推荐阅读

史海拾趣

Anders DX公司的发展小趣事

Anders DX是一家专注于设计和制造显示解决方案的公司,以下是该公司发展的相关故事:

  1. 公司成立与初期阶段:Anders DX成立于2002年,总部位于英国霍尔特。公司的创始人包括Neil Jarvis和David Vallis,他们都在显示技术领域拥有丰富的经验。公司成立之初,主要从事自定义显示解决方案的设计和制造,为各种行业的客户提供定制化的显示产品。

  2. 技术创新与产品开发:Anders DX在其成立初期就致力于技术创新和产品开发。公司团队与客户紧密合作,根据客户的需求和应用场景,设计和制造各种类型的显示解决方案,包括液晶显示屏、触摸屏、OLED显示屏等。他们采用先进的制造工艺和技术,不断推出新产品,满足客户不断变化的需求。

  3. 客户合作与市场拓展:随着公司业务的发展,Anders DX与越来越多的客户建立了紧密的合作关系。公司的客户群涵盖了各个行业,包括医疗、工业、汽车、消费电子等领域。通过与客户的合作,Anders DX不断拓展产品的应用领域和市场份额,在行业内树立了良好的声誉。

  4. 全球布局与生产基地:为了更好地服务全球客户,Anders DX逐步在全球建立了生产基地和销售网络。除了在英国的总部外,公司还在亚洲和美洲地区设立了生产工厂和销售办事处,以满足不同地区客户的需求。这些生产基地拥有先进的设备和技术,能够为客户提供高质量的定制化显示解决方案。

  5. 持续发展与未来展望:作为一家专注于显示解决方案的公司,Anders DX将继续致力于技术创新和产品开发。公司将继续与客户紧密合作,不断推出适应市场需求的新产品,并不断提升生产效率和产品质量,以保持在行业内的竞争优势。同时,Anders DX也将继续关注行业的发展趋势和技术变革,及时调整战略,以确保公司持续健康发展。

Gulf Semiconductor公司的发展小趣事

Gulf Semiconductor在电子行业中的五个发展故事

故事一:进入中国市场与本地化生产

Gulf Semiconductor(海湾电子)自1987年起便踏入中国市场,成为较早一批在中国设立生产基地的国际化整流二极管制造商。公司迅速适应了中国市场的需求,并建立了完善的管理体系,通过了ISO14001:2004、ISO9001:2000、ISO/TS 16949:2002等质量及环境管理体系认证。这一举措不仅提升了产品质量,还增强了客户信心,使Gulf Semiconductor在照明、电源、消费类电子等领域迅速占据一席之地。通过本地化生产,公司有效降低了成本,提高了竞争力,并成功吸引了如Samsung、LG、Philips等国际知名企业的合作。

故事二:技术创新与产品升级

Gulf Semiconductor始终将技术创新视为企业发展的核心动力。公司不断投入研发,掌握了先进的光阻玻璃烧结、特制的SIPOS工艺等多种工艺技术,这些技术使得公司产品在高压、高温等极端环境下依然能够保持高可靠性。特别是公司主推的GP类产品(玻融钝化整流器),凭借其出色的性能,获得了众多国际客户的全面认证和使用。此外,公司还积极开发世界著名整流器制造商的替用产品,产品性能可达到原厂的同等水平,进一步提升了市场竞争力。

故事三:客户服务与售后支持

Gulf Semiconductor深知客户满意是企业发展的关键。公司建立了完善的客户服务体系,为客户提供从产品设计、试产到批量投产的全程支持。在产品应用过程中,一旦出现个别产品缺陷或失效,公司能够迅速响应,分析问题原因,并采取纠正及预防措施,确保客户利益最大化。这种以客户为中心的服务理念,赢得了广大客户的信任和好评。

故事四:市场拓展与国际合作

随着全球电子行业的快速发展,Gulf Semiconductor不断拓宽市场领域,积极与国际知名企业建立合作关系。公司通过参加国际展会、举办技术交流会等方式,向世界展示其先进的技术和产品。同时,公司还加强与国际同行的交流与合作,共同推动电子行业的发展。这些努力不仅提升了Gulf Semiconductor在国际市场的知名度,还为其带来了更多的商业机会。

故事五:可持续发展与环保理念

作为一家负责任的企业,Gulf Semiconductor始终将可持续发展和环保理念贯穿于生产经营的全过程。公司积极采用节能减排技术,减少碳排放,并致力于绿色生产。此外,公司还积极参与社会公益活动,为环保事业贡献自己的力量。这些举措不仅提升了公司的社会形象,还为其赢得了更多消费者的青睐。在未来,Gulf Semiconductor将继续坚持可持续发展和环保理念,为推动电子行业的绿色发展贡献更多力量。

Deltrol Controls公司的发展小趣事

随着电子设备的日益复杂,对内部连接件的要求也越来越高。Deltrol Controls意识到,传统的连接方式已经无法满足行业的需求。为此,公司投入大量资金研发新型软管组件,该组件不仅具有优异的耐温、耐压性能,而且安装简便、维护方便。这一突破性的产品迅速赢得了客户的青睐,Deltrol Controls在电子行业的影响力也进一步扩大。

DBM Optix公司的发展小趣事

DBM Optix公司成立之初,便致力于在光学通信领域取得技术突破。在初创阶段,公司面临着资金紧张、人才匮乏等多重挑战。然而,凭借对技术的执着追求和对市场的敏锐洞察,DBM Optix成功研发出了一款具有高性能、高可靠性的光学模块,这一技术突破迅速获得了市场的认可,为公司的发展奠定了坚实的基础。

Daito Communication Apparatus Co Ltd公司的发展小趣事

自1948年成立以来,Daito公司一直致力于电子元器件的研发与生产。在公司的早期阶段,他们意识到保险丝在电子设备中的重要性,并决定投入大量资源进行研发。经过数年的努力,Daito公司成功开发出了高精度报警保险丝,这一创新产品凭借其卓越的性能和可靠性,迅速在市场上获得了认可。

高精度报警保险丝的成功并没有让Daito公司停止创新的步伐。他们不断对保险丝的失效原因与寿命进行预测和分析,通过全面质量管理,使产品质量得到了显著的提高。同时,Daito公司还将各系列保险丝的额定值多层次化,以满足不同客户的需求,扩大了顾客的选择余地。

AMOTECH(阿莫泰克)公司的发展小趣事

进入21世纪,AMOTECH继续深耕电子领域,特别是在压敏电阻技术上取得了重大突破。2003年,公司的压敏电阻产品被产业资源部评为世界一流产品,这一成就不仅提升了AMOTECH在全球电子行业中的地位,也为其后续发展奠定了坚实基础。同年,公司还成功在韩国安全商协会自动报价首次公开募股,为公司的进一步扩张提供了资金支持。

问答坊 | AI 解惑

Epcos收购恩智浦半导体的RF-MEMS业务

第一季度全球PC出货量增长情况正常 据iSuppli公司,虽然经济形势充满挑战,但2008年第一季度全球PC出货量增长情况符合正常的季节型态,同比增幅达到两位数。 第一季度全球PC单位出货量从2007年第一季度的6240万台上升到6990万台,增长幅度为12.1% ...…

查看全部问答>

dsp项目外包

本人有一个简单图像识别项目需要开发: 要求用CMOS图像传感器和DSP,对图像中的单个圆形亮点进行简单识别,请有兴趣的朋友联系我,合作方式双方商议,不胜感激!   mingrz@126.com…

查看全部问答>

安装wince 5.0时,提示找不到.NET FrameWork 1.1?这是怎么回事

D:\\Backup\\我的文档\\My Pictures 仁慈的人啊,指点一下。。。 我看我XP系统下的这个 FrameWork版本为 2.0的? 非要替换吗…

查看全部问答>

AVR单片机向TR800 GSM模块发送AT命令问题

我想用单片机控制TR800发送短信。 先把PC和TR800连接,用超级终端发AT命令,可以实现发短信。 然后单片机和PC连,向PC串口发数据,接收到的都是正确的命令 最后单片机和TR800连接,命令不能写进去,实在是搞不懂了,向大家求助。 …

查看全部问答>

电源正负极是否短路的测量问题!

请问各位大侠:     我用万用表的通断档测量电路板的正负极之间是否短路时,(电路板未加电时测量)     万用表通断档有时显示的是.548,用电阻档测量时阻值为1.5K;有时通断档显示为1.254,电阻档测得阻值为5.2K.   &nb ...…

查看全部问答>

有没有办法在本地机上测试PERSONAL JAVA开发出的WINCE应用程序?

请教:有没有办法在本地机上测试PERSONAL JAVA开发出的WINCE应用程序? PS:JDK和PJEE已经安装了。。。可是没POCKETPC。。。愁。。。…

查看全部问答>

GPS 模块 1pps的时间同步问题

请教各位大虾:     GPS模块里1PPS的上升沿和串口收到的信息是同步的还是有些时间差?先后时间顺序是啥关系?     如何保证收到的时间和1pps上升沿同步?     谢谢了。急!!…

查看全部问答>

这个图 带宽能估算么?

来自:电子工程师技术交流(12425841) …

查看全部问答>

请教 iar c watch 中变量的问题

main中 局部变量 unsigned int err1,rec1,send1; 全局变量 unsigned int send = 0; unsigned int rec = 0; unsigned int err = 0; 在main中 err1 = err; send1 = s ...…

查看全部问答>