PC串口如何给单片机与pc串口通信供电

我写的一个实现单片机与PC机多机通讯的程序 串口通信 - 单片机/MCU论坛 -
中国电子技术论坛 -
最好最受欢迎电子论坛!
后使用快捷导航没有帐号?
我写的一个实现单片机与PC机多机通讯的程序 串口通信
16:57:45  
19749&查看
& & 下面是我写的一个实现多个下位机(单片机)与一个上位机(PC机)的一主多从串口通讯程序,用的STC89C52RC,定时器2做串口通信波特率发生器。
& &&&实现功能是这样的:
& &&&用调试助手向单片机发送一个数据包。
& &&&通讯协议是这样的:
& && &数据包的格式如下所示(共10个字节组成):
0x2A,0xEB,0x8D,地址码,指令码,数据长度码,数据码,数据码,校验码,0xAD&&
前面三个字节为帧头,即开始符。
地址码: 欲传送的目的地址,即选定哪一个单片机。
指令码:向单片机发送的指令
数据长度码: 用于指示后面有效数据的个数
数据码:传送的数据,配合指令码的纯数据。
校验码: 累加和校验,对地址码,指令码,数据长度码,数据码进行累加,用来检验数据的完整性和正确性。
0xAD : 帧尾,即结束符。
& & 本程序实现功能是这样的:
& & 用调试助手向单片机发送一个数据包,单片机收到后对数据解析,再回传指定的数据。
& & 例如发送:2a eb 8d 01 03 01 01 06 ad
指令码为01,单片机接收到后解析,回传0xce 0x7b 0x11 0xed。其中前两个字节为开始符,最后一个字节为结束符。同理,若收到的指令码为02,回传0xce 0x7b 0x12 0xed。以此模拟控制单片机操作。
若接收错误,即累加校验码不等于单片机实际计算的累加和,回传0xce 0x7b 0x02 0xed,提示接收错误,要求PC重发数据(模拟,需要上位机软件配合才行)。
单片机开机初始化后即向PC发送一个数据0xce 0x7b 0x00 0xed,用于指示单片机与PC通信已连接。
下面是程序:
#define ID 0x01 //单片机地址
uint8 rec_& &//串口通信接收数据
uint8 state_flag=0;&&//通信协议解析状态标志,初始化为0
uint8 retval=0;&&//通信协议解析函数返回值,初始化为0
uint8&&//指令码
uint8 Data[2];&&//数据码
uint8 data_&&//数据长度码
程序大体思想是:
& & 首先定义了几个全局变量,接收到数据后,串口中断子程序中用变量rec_data存储一个字节的数据,随后对数据进行解析:首先判断数据包的完整性,正确性,然后提取指令码,数据码等数据,存放起来用于主程序处理。
& & 协议解析过程中,使用一个变量state_flag的全局变量作为协议解析状态标志,用于确定当前字节处于一帧数据中的那个部位,同时在接收过程中自动对接收数据进行校验和处理,在数据包接收完的同时也进行了校验的比较。因此当帧尾结束符接收到的时候,则表示一帧数据已经接收完毕,并且也通过了校验,关键数据也保存到了缓冲区(cmd和Data[])中。主程序即可通过查询retval的标志位来进行协议的解析处理。如果retval=1;& &//错误标志,数据包传送不正确。如果retval=2;& &//接收成功标志,数据包传送成功。
& & 接收过程中,只要哪一步收到的数据不是预期值,则直接将状态标志复位,用于下一帧数据的判断,避免状态自锁。
& & 以下是程序:
void PortInit();& && && && && & //各端口初始化
void TimerInit();& && &&&//定时器初始化
void UsartInit();& && &&&//串口初始化
void usart_cmd_scan();& && &&&//串口命令扫描
void Data_analysis();& &//通信协议解析函数
void Send(uint8 sendcmd);&&//数据发送函数
/*--------------------------------& && &&&串口中断服务子程序 ------------------------------------*/
void ser() interrupt 4
& &rec_data=SBUF;& &//读取接收到的数据
& &Data_analysis();//数据解析&&
* 函数名:Data_analysis
* 描&&述:通信协议解析函数
* 输&&入:无
* 输&&出:无
* 备&&注:解析串口接收到的数据
/*--------------------------------& && &&&多机通信协议格式 ------------------------------------*/
/*&&数据包的格式如下所示(共10个字节组成): */
/*&&0x2A,0xEB,0x8D,地址码,指令码,数据长度码,数据码,数据码,校验码,0xAD&&*/
void Data_analysis()
& &static uchar recdata_sum=0;&&//存放累加和
& &static uchar lencnt=0;&&//数据长度计数器
& &switch (state_flag)
& && &&&case 0:
& && && & {
& && && && & if(rec_data == 0x2A)& &&&// 是否帧头第一个数据
& && && && && &state_flag = 1;
& && && && & else
& && && && && &state_flag = 0;& & // 标志复位
& && && && && && &
& && && & }
& && &&&case 1:
& && && & {
& && && && & if(rec_data == 0xEB)& &&&// 是否帧头第二个数据
& && && && && &state_flag = 2;
& && && && & else
& && && && && &state_flag = 0;& & // 标志复位
& && && && &
& && && & }
& && &&&case 2:
& && && & {
& && && && & if(rec_data == 0x8D)& &&&// 是否帧头第三个数据
& && && && && &state_flag = 3;
& && && && & else
& && && && && &state_flag = 0;& & // 标志复位
& && && && &
& && && & }
& && &&&case 3:
& && && & {
& && && && & if(rec_data == ID)& & // 判断目的地址是否正确
& && && && && &{
& && && && && && &state_flag = 4;
& && && && && && &recdata_sum=rec_& &//开始累加
& && && && && &}& &
& && && && & else
& && && && && &state_flag = 0;& &// 标志复位
& && && && &
& && && & }
& && &&&case 4:
& && && & {
& && && && & state_flag = 5;
& && && && & cmd=rec_&&//指令码存储
& && && && & recdata_sum+=rec_&&//累加
& && && && &
& && && & }& && &&&
& && &&&case 5:
& && && & {
& && && && & lencnt = 0;&&//数据长度计数器清零
& && && && & data_count=rec_&&//数据长度码存储
& && && && & recdata_sum+=rec_&&//累加
& && && && & if (data_count!=0)&&//后面有数据码
& && && && && &state_flag=6;
& && && && & else
& && && && && &state_flag=8;
& && && && &
& && && & }
& && &&&case 6:
& && &&&case 7:
& && && & {
& && && && &&&Data[lencnt++]=rec_&&//数据码保存
& && && && &&&recdata_sum+=rec_& &//累加
& && && && &&&if(lencnt==data_count)
& && && && &&&{
& && && && && && && && && && && && && && &state_flag=8;
& && && && && && && && && && && && && & lencnt = 0;& && &&&
& && && && && && && && &&&}&&
& && && && && && && && && && &&&
& && && && &&&else
& && && && && & state_flag=7;
& && && && &&&
& && && & }
& && &&&case 8:
& && && & {
& && && && & if(recdata_sum==rec_data)& &//数据校验,判断累加和是否相等
& && && && && &state_flag=9;
& && && && & else
& && && && && &{
& && && && && && &retval=1;& &//置错误标志,数据包传送不正确。
& && && && && && &state_flag=0;& &
& && && && && &}
& && && && && && && && & recdata_sum=0;//累加和清零
& && && && &
& && && & }
& && &&&case 9:
& && && & {
& && && && & if (rec_data==0xAD)
& && && && && &{
& && && && && && && && && && && && && && & retval=2;& &//置接收成功标志,数据包传送成功。
& && && && && && && && && && && && && & state_flag=0;
& && && && && && && && && &}
& && && && & else
& && && && && &state_flag=0;
& && && && &
& && && & }
//主程序 , 不断扫描串口接收到的命令
void main()
& && &&&PortInit();& && && && && & //各端口初始化
& && &&&TimerInit();& && &&&//定时器初始化
& && &&&UsartInit();& && &&&//串口初始化& && && && && && && && && && && &&&
& && &&&Send(0xce);
& && &&&Send(0x7b);
& && &&&Send(0x00);
& && &&&Send(0xed);
& && &&&while(1)
& && && && && & usart_cmd_scan();& && &&&//串口命令扫描
& && &&&}& && &&&
* 函数名:usart_cmd_scan
* 描&&述:串口命令扫描
* 输&&入:无
* 输&&出:无
* 备&&注:扫描PC通过串口发送的命令
void usart_cmd_scan()
& && &&&& &//下位机向PC发送的命令码
& && && &&&switch (retval)
& && &&&case 1:& && &//数据发送错误,请求PC重发
& && && & {
& && && && & sendcmd=2;&&//向PC发送的重发数据命令,PC识别后向下位机重发数据包。
& && && && & Send(0xce);
& && && && && && && && & Send(0x7b);
& && && && && && && && & Send(sendcmd);
& && && && && && && && & Send(0xed);&&//向PC发送命令
& && && && && && && && & retval=0;& &//标志清零,防止重复扫描,重复执行。&&
& && && && && && && && &
& && && & }
& && &&&case 2:& && &//数据发送成功,执行命令
& && && & {
& && && && & switch (cmd)& & //命令解码
& && && && && && && && & {
& && && && && && && && && && && &case 0x01:
& && && && && && && && && && &&&{
& && && && && && && && && && && && && & Send(0xce);
& && && && && && && && && && && && && & Send(0x7b);
& && && && && && && && && && && && && & Send(0x11);
& && && && && && && && && && && && && & Send(0xed);
& && && && && && && && && && && && && & cmd=0x00;
& && && && && && && && && && && && && &
& && && && && && && && && && &&&}
& && && && && && && && && && &&&case 0x02:
& && && && && && && && && && &&&{
& && && && && && && && && && && && && & Send(0xce);
& && && && && && && && && && && && && & Send(0x7b);
& && && && && && && && && && && && && & Send(0x12);
& && && && && && && && && && && && && & Send(0xed);
& && && && && && && && && && && && && & cmd=0x00;
& && && && && && && && && && && && && &
& && && && && && && && && && &&&}
& && && && && && && && && && &&&case 0x03:
& && && && && && && && && && &&&{
& && && && && && && && && && && && && & Send(0xce);
& && && && && && && && && && && && && & Send(0x7b);
& && && && && && && && && && && && && & Send(0x13);
& && && && && && && && && && && && && & Send(0xed);
& && && && && && && && && && && && && & cmd=0x00;
& && && && && && && && && && && && && &
& && && && && && && && && && &&&}& && && && && &&&
& && && && && && && && & }
& && && && &}
& && && && && && &retval=0;& &//标志清零,防止重复扫描,重复执行。
* 函数名:Send
* 描&&述:串口数据发送函数
* 输&&入:sendcmd - 待发送的数据
* 输&&出:无
* 备&&注:
void Send(uint8 sendcmd)
& &ES=0;&&//关闭串口
& &SBUF=&&//发送数据,向PC发送。
& &while(!TI);
& &TI=0;&&//发送完成,TI清零
& &ES=1;&&//开串口
以上是我写的这个程序,希望大家指点一下。
程序运行整体可以,但是有个问题,也希望大神们能帮忙看一下什么问题
每次在单片机关机后,再重新上电后,发送都没反应,只有手动按下开发板的复位键后才能正常通信,当再次断电上电后,又不行了,又得按复位键才正常。按说开发板上电就复位了呀,为什么还要手动复位才行?什么的问题?你们试一下这个程序有这个问题吗?
& & 还望大神们帮忙指点啊!
11:31:40  
贴一下具体的复位电路看看 是不是元件取值不合适 脉冲宽度不够
11:18:18  
大哥,你这个可以实现pc对多个单片机吗?我的点对点可以,一对多就不可以,希望指点,谢谢!急啊!
高级工程师
08:33:53  
谢谢楼主分享好资料,先收藏了,方便学习交流,我正在收集这方面资料。
13:59:56  
楼主厉害了啊,我自己写一个点对点的,没成功,用的RS-485总线,我就是想不明白,请楼主指点指点
12:25:11  
好好看看。。。。。。。。。。。。。
13:46:54  
学习学习很不错的分享
20:02:54  
刚好用到这个,,谢谢楼主,好人灬灬灬灬灬灬灬灬灬灬灬灬
22:26:41  
学习学习很不错的分享
09:00:01  
好东西,刚好需要,学习一下
10:52:46  
我不会告诉你,如果知道了CAN就不用这么麻烦了,亦或者你看看MODBUS协议就知道了。
等待验证会员
06:34:32  
初始化之后延时再发送试试
18:28:06  
楼主很强啊,谢谢分享
23:42:00  
可以的,很棒
10:07:46  
复位电路可能有问题
11:36:13  
谢谢 分享!!!!!
13:38:46  
13:39:34  
等待验证会员
15:27:59  
LZ 我试了一下&&助手上没有显示单片机回复的数据啊
16:01:13  
Powered by
供应链服务
版权所有 (C) 深圳华强聚丰电子科技有限公司单片机与pc串口通讯的实现_图文_百度文库
您的浏览器Javascript被禁用,需开启后体验完整功能,
享专业文档下载特权
&赠共享文档下载特权
&10W篇文档免费专享
&每天抽奖多种福利
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
单片机与pc串口通讯的实现
阅读已结束,下载本文需要
想免费下载本文?
定制HR最喜欢的简历
下载文档到电脑,同时保存到云知识,更方便管理
加入VIP
还剩1页未读,
定制HR最喜欢的简历
你可能喜欢豆丁微信公众号
君,已阅读到文档的结尾了呢~~
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
单片机与PC串口连接
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='http://www.docin.com/DocinViewer-4.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口  这篇文章咱们首要讲单片机上串口的作业原理和怎样经进程序来对串口进行设置,以及依据所给出的实例结束与PC 机通讯。  一、原理简介  51 单片机内部有一个全双工串行接口。啥叫全双工串口呢一般来说,只能承受或只能发送的称为单工串行;既可接纳又可发送,但不能一起进行的称为半双工;能一起接纳和发送的串行口称为全双工串行口。串行通讯是指数据一位一位地按次第传送的通讯办法,其杰出长处是只需一根传输线,可大大下降硬件本钱,合适远间隔通讯。其缺陷是传输速度较低。  与之前相同,首要咱们来了解单片机串口有关的寄存器。  SBUF 寄存器:它是两个在物理上独立的接纳、发送缓冲器,可一起发送、接纳数据,可经过指令对SBUF 的读写来差异是对接纳缓冲器的操作仍是对发送缓冲器的操作。然后操控外部两条独立的收发信号线RXD(P3.0)、TXD(P3.1),一起发送、接纳数据,结束全双工。  串行口操控寄存器SCON(见表1) 。  表1 SCON寄存器  表中各位(从左至右为从高位到低位)意义如下。  SM0 和SM1 :串行口作业办法操控位,其界说如表2 所示。  表2 串行口作业办法操控位  其间,fOSC 为单片机的时钟频率;波特率指串行口每秒钟发送(或接纳)的位数。  SM2 :多机通讯操控位。 该仅用于办法2 和办法3 的多机通讯。其间发送机SM2 = 1(需求程序操控设置)。接纳机的串行口作业于办法2 或3,SM2=1 时,只需当接纳到第9 位数据(RB8)为1 时,才把接纳到的前8 位数据送入SBUF,且置位RI 宣告接连恳求致使串行接纳接连,不然会将接遭到的数据抛弃。当SM2=0 时,就不论第位数据是0 仍是1,都将数据送入SBUF,并置位RI 宣告接连恳求。作业于办法0 时,SM2 有必要为0。  REN :串行接纳容许位:REN =0 时,阻挠接纳;REN =1 时,容许接纳。  TB8 :在办法2、3 中,TB8 是发送机要发送的第9 位数据。在多机通讯中它代表传输的地址或数据,TB8=0 为数据,TB8=1 时为地址。  RB8 :在办法2、3 中,RB8 是接纳机接纳到的第9 位数据,该数据刚好来自发送机的TB8,然后辨认接纳到的数据特征。  TI :串行口发送接连恳求象征。当CPU 发送完一串行数据后,此刻SBUF 寄存器为空,硬件使TI 置1,恳求接连。CPU 照应接连后,由软件对TI 清零。  RI :串行口接纳接连恳求象征。当串行口接纳完一帧串行数据时,此刻SBUF 寄存器为满,硬件使RI 置1,恳求接连。CPU 照应接连后,用软件对RI 清零。  电源操控寄存器PCON(见表3) 。  表3 PCON寄存器  表中各位(从左至右为从高位到低位)意义如下。  SMOD :波特率加倍位。SMOD=1,当串行口作业于办法1、2、3 时,波特率加倍。SMOD=0,波特率不变。  GF1、GF0 :通用象征位。  PD(PCON.1) :掉电办法位。当PD=1 时,进入掉电办法。  IDL(PCON.0) :待机办法位。当IDL=1 时,进入待机办法。  别的与串行口有关的寄存器有前面文章叙说的守时器有关寄存器和接连寄存器。守时器寄存器用来设定波特率。接连容许寄存器IE 中的ES 位也用来作为串行I/O 接连容许位。当ES = 1,容许 串行I/O 接连;当ES = 0,阻挠串行I/O 接连。接连优先级寄存器IP的PS 位则用作串行I/O 接连优先级操控位。当PS=1,设定为高优先级;当PS =0,设定为低优先级。  波特率核算:在了解了串行口有关的寄存器往后,咱们可得出其通讯波特率的一些定论:  ① 办法0 和办法2 的波特率是固定的。  在办法0 中, 波特率为时钟频率的1/12, 即fOSC/12,固定不变。  在办法2 中,波特率取决于PCON 中的SMOD 值,即波特率为:  当SMOD=0 时,波特率为fosc/64 ;当SMOD=1 时,波特率为fosc/32。  ② 办法1 和办法3 的波特率可变,由守时器1 的溢出率抉择。  当守时器T1 用作波特率发作器时,一般选用守时初值主动重装的作业办法2( 留心:不要把守时器的作业办法与串行口的作业办法搞混杂了)。其计数构造为8 位,假定计数初值为Count,单片机的机器周期为T,则守不时刻为(256 Count)×T 。然后在1s内发作溢出的次数(即溢出率)可由公式(1)所示:  然后波特率的核算公式由公式(2)所示:  在实习运用时,一般是先断定波特率,后依据波特率求T1 守时初值,因而式(2)又可写为:  二、电路详解3  图1 串行通讯试验  下面就对图1 所示电路进行具体阐明。  最小体系有些(时钟电路、复位电路等)榜首讲现已讲过,在此不再叙说。咱们要害来了解下与核算机通讯的RS-232 接口电路。能够看到,在电路图中,有TXD 和RXD 两个接纳和发送指示情况灯,此外用了一个叫MAX3232 的芯片,那它是用来结束啥的呢首要咱们要知道核算机上的串口是具有RS-232 规范的串行接口,而RS-232 的规范中界说了其特性:高电平“1”信号电压的计划为-15V~-3V,低电平“0”  信号电压的计划为+3V~+15V。或许有些读者会问,它为啥要以这么的电气特性呢这是因为凹凸电平用相反的电压标明,最罕见6V 的压差,十分好的前进了数据传输的牢靠性。因为单片机的管脚电平为TTL,单片机与RS-232 规范的串行口进行通讯时,首要要处理的即是电平改换的疑问。一般来说,能够挑选一些专业的集成电路芯片,如图中的MAX3232。MAX3232 芯片内部集成了电压倍增电路,单电源供电即可结束电平改换,并且作业电压宽,3V~5.5V 间均能正常作业。其典型运用如图中所示,其外围所接的电容对传输速率有影响,在试验套件中选用的是0.1μF。  值得一提的是MAX3232 芯片具有两对电平改换线路,图中只用了一路,因而糟蹋了另一路,在一些场合能够将两路并联以取得较强的驱动抗搅扰才干。此外,咱们有必要了解图中与核算机相连的DB-9 型RS-232的引脚构造(见图2)。  图2 DB-9联接器接口图  其各管脚界说如下(见表4)。  表4 DB-9型接口管脚界说  三、程序计划  本讲计划实例程序如下:  #include "AT89X52.h" (1)  void Init_Com(void) ( 2)  {  TMOD = 0x20; ( 3)  PCON = 0x00; ( 4)  SCON = 0x50; ( 5)  TH1 = 0xE8; ( 6)  TL1 = 0xE8; ( 7)  TR1 = 1; ( 8)  }  void main(void) ( 9)  {   ( 10)  Init_Com(); ( 11)  while(1) ( 12)  程序具体阐明:  (1)头文件包括。  (2)声明串口初始化程序。  (3)设置守时器1 作业在办法2,主动装载初值(详见第二讲)。  (4)SMOD 位清0,波特率不加倍。  (5)串行口作业在办法1,并容许接纳。  (6)守时器1 高8 位赋初值。波特率为1200b/s(7)守时器1 低8 位赋初值。  (8)主张守时器。  (9)主函数。  (10)界说一个字符型变量。  (11)初始化串口。  (12)死循环。  (13)假定接纳到数据。  (14)将接纳到的数据赋给之前界说的变量。  (15)将接纳到的值输出到P0 口。  (16)对接纳象征位清0,预备再次接纳。  (17)将接纳到的数据又发送出去。  (18)查询是不是发送结束。  (19)对发送象征位清0。  四、调试要害与试验景象  接好硬件,经过冷主张办法将程序所生成的。hex文件下载到单片机作业后,翻开串口调试帮手软件,设置好波特率1200,复位单片机,然后在经过串口调试帮手往单片机发送数据(见图3),能够查询到在接纳窗口有发送的数据显现,此外电路板上的串行通讯指示灯也会闪耀,P0 口所接到LED 灯会闪耀所接纳到的数据。  图3 串口软件调试界面  别的串口调试帮手软件运用时应留心的是,假定单片机开发板选用串口下载并且和串口调试帮手是运用同一串口,则在翻开串口软件的一起不能给单片机下载程序,如需求下载,请首要害击“封闭串口”,做发送试验的时分,留心假定选中16 进制发送的即是数字或许字母的16 进制数值,比方发送“0”,实习接纳的就应当是0x00,假定不选中,默许发送的是ASCII 码值,此刻发送“0”,实习接纳的就应当是0x30,这点能够经过查询板子P0 口上的对应的LED 指示出来。  五、总结  本讲介绍了单片机串口通讯的原理并给出了实例,经过该讲,读者能够了解和把握51 单片机串口通讯的原理与运用流程,运用串口通讯,单片机能够与核算机相连,也能够单片机互联或许多个单片机彼此通讯组网等,在实习的工程运用中十分广泛。从学习的视点来说,娴熟的运用串口将单片机体系中的有关信息显如今核算机上能够很直观便当的进行调试和开发。
本站部分资源是从网上搜集编辑的,若侵犯了您的版权和利益,请发邮件:联系我们删除处理!后使用快捷导航没有帐号?
请完成以下验证码
查看: 1992|回复: 6
关于pc和单片机的串口通信
在线时间0 小时
TA的帖子TA的资源
一粒金砂(中级), 积分 62, 距离下一级还需 138 积分
一粒金砂(中级), 积分 62, 距离下一级还需 138 积分
本人做了一个温控节点,把温度数据通过串口实时的传给pc,我也可以在pc上发命令给单片机,现在问题是:如果我不发命令给单片机,则系统正常,pc可以正常接收单片机发来的温度数据,但当我发命令给单片机时,系统就卡死了。我怀疑是当我通过pc发命令时,pc正好在接收数据(因为温度数据是实时发送的,不停的),所以发生冲突,导致系统卡死,不知道我的怀疑对还是错??不知道有没有什么解决方法,既可以把温度数据实时的传给pc,pc也可以随时发命令给单片机,求高人解答!!
在线时间0 小时
TA的帖子TA的资源
一粒金砂(初级), 积分 4, 距离下一级还需 1 积分
一粒金砂(初级), 积分 4, 距离下一级还需 1 积分
你的单片机的串口在处理与PC的通讯,是采用的中断 还是轮询 方式啊?
感觉很可能是单片机采用了中断,但单片机的UART接受中断函数处理不当,
从而当PC端发送数据时,单片机进入接受中断 就死掉?
你看看你对单片机串口的 初始化是否正确? 如果采用中断,好好看看中断初始化,以及中断处理函数。
在线时间2 小时
TA的帖子TA的资源
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
估計是你程序的問題,接收數據過快導致程序卡死是很容易的,像溫度這樣的變化不是很快的數據,1秒采集一次就已經是很快的了
這種串口通信的問題可以參考Modbus協議來做
看懂后你可以自己定一個一問一答的協議也可以
在线时间2 小时
TA的帖子TA的资源
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
使用串口调试器先调试一下通信,看看返回
在线时间2 小时
TA的帖子TA的资源
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
&&232 通讯, 加个max232 进行ttl 与电脑的串口电平转化,有mscomm 控件可以调用。 卡死是软件问题。
在线时间0 小时
TA的帖子TA的资源
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
卡死一般不太会是PC端的问题。
查查你单片机的程序,要是中断接收的话,很有可能就在中断里卡死了。
我怀疑是在等待标志位那里,或者是数据处理那里挂掉了。
你看一下吧。
在线时间0 小时
TA的帖子TA的资源
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
问题已经解决了,主要有两个问题,一是数据发的频率太高了,容易照成冲突;二、发送数据之前没有检查有没有正在接收。把上面两个问题解决后就行了,谢谢大家的建议哦。。。。
EEWORLD 官方微信
Powered by

我要回帖

更多关于 单片机串口发送字符串 的文章

 

随机推荐