单片机串口通信时,在串口初始化之前要加延时吗?

wojiazaijiangsu 2012-07-03 10:27:19
各位高手:我们编了一个串口通信程序,当串口初始化前不加延时的时候 ,发送的数据与接收的数据正好错一位。
加上之后就好了,这是为什么?大哥们帮我解决一下下!谢啦谢啦!
...全文
671 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
myzhaobin 2012-08-31
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 的回复:]
恩,貌似是晶振的问题,换了一个晶振就好了。谢啦
[/Quote]
你在串口初始化前是不是有做时钟源调整?如果是的话最好做一定的延迟用来等待振荡器稳定。
wojiazaijiangsu 2012-08-03
  • 打赏
  • 举报
回复
恩,貌似是晶振的问题,换了一个晶振就好了。谢啦
car_software 2012-07-30
  • 打赏
  • 举报
回复
你是不是刚一上电就去初始呀,
billowtust 2012-07-28
  • 打赏
  • 举报
回复
我以前也遇到过,串口初始化之前,也就是单片机刚开始执行代码时,需要延时以后,再初始化UART,才能正确收发数据

也没找问题到底出在哪,可能是晶振吧,不确定
ldk527 2012-07-26
  • 打赏
  • 举报
回复
不需要
mszsq168 2012-07-25
  • 打赏
  • 举报
回复
感觉是程序的BUG吧,好好看看程序!
ying_593254979 2012-07-13
  • 打赏
  • 举报
回复
应该有特殊的寄存器,用while判断一下晶振是否稳定。
稳定之后在发数据。
lbing7 2012-07-13
  • 打赏
  • 举报
回复
加上之后就好了,这是为什么?大哥们帮我解决一下下!谢啦谢啦!

感觉这个可能是该芯片的串口有两级缓冲的原因

第一级缓冲是供单片机读写的

第二级是用于通信的。

在第二级缓冲完成通信,串口会根据第一级缓冲是不是空来选择产生的中断

如果,通信完成,缓冲为空,会产生通信完成中断

如果通信完成,缓冲不为空,会把第一级缓冲中的数据送入第二级,进行通信,同时产生的是缓冲为空的中断

LZ可能是都用缓冲为空中断进行处理,其实缓冲为空的时候,通信才刚刚开始,如果这个时候恢复了总线上的状态(如485中的收和发切换)就会造成通信错误,最后一个字节丢失

所以在应用上,通常要对最后一个字节等待的中断标志进行更换

francisxie27 2012-07-10
  • 打赏
  • 举报
回复
单片机处理数据的速度太快,最好加一点delay,保证通信正常
AnYidan 2012-07-05
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]

不需要。
[/Quote]

++

从没发现lz 的情况,用的什么串口?
woshi_ziyu 2012-07-04
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]

不需要。
[/Quote]
++

我理解错LZ的意思了
aydf1 2012-07-03
  • 打赏
  • 举报
回复
需要将缓冲区里面的数据移位到输出口 否则读出的是上次的数据
用户 昵称 2012-07-03
  • 打赏
  • 举报
回复
不需要。
woshi_ziyu 2012-07-03
  • 打赏
  • 举报
回复
需要将缓冲区里面的数据移位到输出口 否则读出的是上次的数据
贝隆 2012-07-03
  • 打赏
  • 举报
回复
在发送后需要加上一个延迟,因为通信都是需要消耗时间的。延迟后可以等待通信的完成。
dceacho 2012-07-03
  • 打赏
  • 举报
回复
一般不需要,只是在切换或启动晶振后需要一下,你这个不知道原因
a1975654714 2012-07-03
  • 打赏
  • 举报
回复
一般不需要,只是在切换或启动晶振后需要一下
myzhaobin 2012-07-03
  • 打赏
  • 举报
回复
一般的串口发送字节函数 都会有一个发送完毕等待的过程。例如:MSP430的就是是
while (!(IFG2 & UCA0TXIFG)) ;楼主还是根据自己MCU型号,找相关例程比对一下吧。
第1章 串行通信原理与设计 1 1.1 串行通信基本概念 1 1.1.1 串行通信特点 1 1.1.2 串行通信传输方式 2 1.1.3 数据纠错与检错 2 1.1.4 传输速率与距离 3 1.2 串行传输协议 4 1.2.1 异步传输协议 4 1.2.2 面向字符的同步传输协议 5 1.2.3 面向比特的同步传输协议 7 1.3 串行接口标准 9 1.3.1 EIA RS-232C标准 9 1.3.2 RS-423A、RS-422A和RS-485标准 12 1.3.3 USB接口标准 14 1.4 串口硬件设计 15 1.4.1 串口应用设计流程 15 1.4.2 Windows下的串口资源 15 1.4.3 DCE与DTE设备的识别方法 16 1.4.4 握手处理 16 1.4.5 RS-232C与RS-485接口转换 17 1.4.6 接地及隔离技术 17 1.5 小结 20 第2章 使用MSComm控件编程 21 2.1 MSComm控件属性及事件 21 2.1.1 MSComm最常用的属性 21 2.1.2 与输入操作有关的属性 23 2.1.3 与输出操作有关的属性 24 2.1.4 与传输控制有关的属性 25 2.1.5 MSComm控件的事件 26 2.2 对不同类型数据的处理方法 26 2.2.1 使用MSComm控件发送与接收字符串 27 2.2.2 使用MSComm控件发送与接收二进制数据 27 2.3 MSComm错误处理方法 28 2.3.1 关于发送缓冲区 28 2.3.2 关于接收缓冲区 29 2.3.3 接收数据的实际处理方法 29 2.4 控件编程 30 2.4.1 加载及使用控件 31 2.4.2 初始化及打开串口 36 2.4.3 串口事件处理 37 2.4.4 关闭串口 38 2.4.5 关于协议的问题 38 2.5 通信编程实例 38 2.5.1 程序功能 38 2.5.2 界面设计 38 2.5.3 变量声明 40 2.5.4 创建串口 41 2.5.5 设置串口 42 2.5.6 打开串口 43 2.5.7 关闭串口 43 2.5.8 接收数据处理 44 2.5.9 实际传输文件截图 45 2.6 程序发布问题 45 2.7 小结 45 第3章 使用WinAPI串口编程 47 3.1 API串口编程概述 47 3.2 采用同步查询方式的编程方法 47 3.2.1 创建串口 48 3.2.2 关闭串口 53 3.2.3 发送数据 53 3.2.4 接收数据 53 3.2.5 定接收数据的方法 54 3.3 采用重叠I/O方式的编程方法 55 3.3.1 定义全局变量 55 3.3.2 创建串口 55 3.3.3 发出读写操作 56 3.3.4 读写线程函数的建立 57 3.3.5 关闭串口 61 3.4 采用事件驱动方式的编程方法 61 3.4.1 定义全局变量 61 3.4.2 打开串口及开启事件线程 62 3.4.3 发送数据 64 3.4.4 自定义消息函数读取数据 65 3.4.5 关闭串口及关闭事件线程 67 3.5 编程实例 67 3.5.1 程序功能 67 3.5.2 界面设计 68 3.5.3 变量声明 69 3.5.4 设置串口 70 3.5.5 打开串口 72 3.5.6 关闭串口 73 3.5.7 发送字符 73 3.5.8 命令的有效性处理 74 3.5.9 实际字符传送截图 75 3.6 小结 76 第4章 多线程编程 77 4.1 多线程基本概述 77 4.1.1 线程与进程 77 4.1.2 何使用多线程 78 4.1.3 多线程串口的应用 78 4.2 线程的操作 78 4.2.1 创建线程 78 4.2.2 终止线程 80 4.2.3 关于内存泄漏 81 4.3 线程间通信 81 4.3.1 使用全局变量 81 4.3.2 使用自定义消息 81 4.4 线程同步 82 4.4.1 使用临界区(Critical Section) 82 4.4.2 使用互斥对象(Mutex) 83 4.4.3 使用信号量(Semaphore) 84 4.4.4 使用事件(Event) 84 4.4.5 各种方法的比较 85 4.5 多线程串口程序设计 85 4.5.1 多线程的应用框架 85 4.5.2 相关的声明 86 4.5.3 创建线程 87 4.5.4 编写线程函数 87 4.5.5 编写消息响应函数 88 4.5.6 线程的结束 88 4.6 小结 89 第5章 TAPI编程 91 5.1 关于TAPI 91 5.1.1 什么是TAPI 91 5.1.2 Windows中的TAPI系统架构 91 5.1.3 Windows中的TAPI电话服务类型 92 5.2 TAPI 2.X介绍 93 5.2.1 基本概念 93 5.2.2 TAPI应用程序结构 93 5.2.3 常用函数介绍 94 5.3 CTapi14类介绍 98 5.3.1 变量/函数声明 98 5.3.2 初始化操作 100 5.3.3 创建函数 100 5.3.4 呼叫函数 101 5.3.5 回调函数处理方式 103 5.3.6 与回调相关的函数 103 5.3.7 处理呼叫状态的函数 105 5.3.8 处理连接状态的函数 108 5.3.9 挂机函数 109 5.3.10 通信状态显示函数 110 5.3.11 函数 111 5.4 使用CTapi14类的编程实例 111 5.4.1 程序功能 111 5.4.2 界面设计 111 5.4.3 CTapi14类的使用方法 112 5.4.4 变量/函数声明 113 5.4.5 电话操作函数 114 5.4.6 消息处理函数 115 5.4.7 显示信息函数 117 5.4.8 实际使用截图 117 5.5 小结 118 第6章 计算机与单片机通信 119 6.1 单片机串口原理 119 6.1.1 串口结构 119 6.1.2 串口寄存器及中断 120 6.2 串行通信硬件设计 121 6.2.1 常用接口芯片介绍 121 6.2.2 接口电路 121 6.3 串行口通信参数设置 122 6.3.1 波特率的设置 122 6.3.2 奇偶校验位的使用方法 123 6.3.3 通信协议约定 123 6.4 单片机串口编程方法 124 6.4.1 功能描述 124 6.4.2 通信协议 124 6.4.3 初始化串口及寄存器 124 6.4.4 编写中断服务程序 125 6.5 计算机界面设计 128 6.5.1 功能描述 128 6.5.2 界面设计 128 6.6 计算机端程序设计 129 6.6.1 头文件引用及变量声明 129 6.6.2 初始化控件 131 6.6.3 向单片机发出请求 132 6.6.4 在控件事件中接收数据 133 6.6.5 超器的编程 140 6.6.6 关闭串口 141 6.7 小结 142 第7章 计算机与PLC通信 143 7.1 PLC的串口通信 143 7.1.1 PLC的通信方式 143 7.1.2 计算机与PLC通信流程 144 7.1.3 与通信相关的寄存器 144 7.1.4 与通信相关的指令 148 7.1.5 通信中断事件 149 7.1.6 通信中断指令 150 7.1.7 硬件连线及设置 151 7.1.8 PC/PPI电缆切换间的影响 151 7.2 PLC通信编程 152 7.2.1 功能描述 152 7.2.2 通信协议 152 7.2.3 程序结构及变量说明 153 7.2.4 主程序 154 7.2.5 初始化 154 7.2.6 发送与接收处理 155 7.3 计算机界面设计 158 7.3.1 主界面设计 158 7.3.2 设置对话框设计 159 7.4 计算机程序设计 160 7.4.1 功能描述 160 7.4.2 变量/函数声明 160 7.4.3 初始化代码 161 7.4.4 参数配置 162 7.4.5 读串口操作 166 7.4.6 写串口操作 169 7.4.7 接收数据处理 172 7.4.8 命令有效性处理 178 7.4.9 实际传输数据截图 179 7.5 小结 180 第8章 计算机与Modem的通信 181 8.1 Modem的工作原理 181 8.1.1 Modem的基本工作原理 181 8.1.2 Modem的功能介绍 182 8.1.3 内置Modem与外置Modem 182 8.2 Modem的通信标准 183 8.2.1 调制协议 183 8.2.2 差错控制协议 184 8.2.3 数据压缩协议 184 8.2.4 文件传输协议 184 8.3 Modem的AT命令 185 8.3.1 Modem工作状态切换 185 8.3.2 AT命令串简介 187 8.3.3 常用基本AT命令分类 187 8.3.4 呼叫与应答相关命令 187 8.3.5 状态切换命令 190 8.3.6 握手相关命令 191 8.3.7 基本AT命令的简单测试方法 192 8.3.8 常用寄存器命令及寄存器含义 194 8.3.9 使用PSTN进行串行通信的工作流程 195 8.4 使用Modem远程传输文件程序设计 196 8.4.1 功能描述 196 8.4.2 通信流程 197 8.4.3 XModem通信协议 198 8.4.4 界面设计 199 8.4.5 变量声明 200 8.4.6 初始化 201 8.4.7 串口配置与操作 202 8.4.8 发送文件 204 8.4.9 接收文件 205 8.4.10 OnComm事件函数 206 8.4.11 建立超器 228 8.5 小结 230 第9章 两台计算机间通信 231 9.1 通信方式介绍 231 9.2 通信协议 232 9.2.1 通信流程 233 9.2.2 数据包格式 233 9.3 通信实现思路 234 9.3.1 功能描述 234 9.3.2 通信事件的处理方法 235 9.3.3 各种操作状态的含义 235 9.4 界面设计 237 9.4.1 主界面设计 237 9.4.2 设置对话框设计 238 9.5 程序设计 239 9.5.1 变量/函数声明 239 9.5.2 初始化代码 241 9.5.3 参数配置 242 9.5.4 发送文件 246 9.5.5 事件消息响应函数 248 9.5.6 命令的有效性处理 267 9.5.7 自定义功能函数 269 9.5.8 程序测试 274 9.6 小结 274 第10章 软件传真机 275 10.1 传真的基本知识 275 10.1.1 工作原理 275 10.1.2 传真机的分类 276 10.1.3 传真机通信规程 277 10.2 关于传真精灵SmartFax 278 10.2.1 主要功能 278 10.2.2 发送传真函数 278 10.2.3 接收传真函数 281 10.2.4 其他功能函数 283 10.2.5 如何使用传真精灵 284 10.3 软件传真机程序设计 285 10.3.1 功能介绍 285 10.3.2 界面设计 286 10.3.3 关于头文件的引用 289 10.3.4 变量/函数声明 289 10.3.5 初始化操作 291 10.3.6 程序流程分析 293 10.3.7 关于TAPI操作的函数 296 10.3.8 发送传真相关函数 304 10.3.9 接收传真相关函数 306 10.3.10 传真消息响应函数OnSmartFax() 309 10.3.11 传真参数相关操作函数 317 10.3.12 其他功能函数 322 10.4 小结 324 第11章 计算机与射频卡通信 325 11.1 射频卡简介 325 11.1.1 射频卡工作原理 325 11.1.2 射频卡的分类 326 11.1.3 射频卡的优点 327 11.1.4 射频卡的应用 327 11.2 射频卡的应用框架 327 11.3 MIFARE卡介绍 328 11.3.1 TYPE A 与TYPE B 328 11.3.2 TYPE A 卡的初始化与防冲突 329 11.3.3 MIFARE 1型卡的存储结构 333 11.3.4 MIFARE 1型卡存取控制与数据区的关系 334 11.4 射频卡模块介绍 336 11.4.1 MCM200/MCM500概述 336 11.4.2 MCM200/MCM500接口简介 337 11.4.3 MCM200/MCM500读写操作过程 338 11.4.4 ZLG500A读写模块介绍 339 11.5 射频卡应用的设计 340 11.5.1 读写器成品的设计方法 340 11.5.2 使用射频卡模块的设计方法 340 11.6 小结 340 第12章 组态王的应用 341 12.1 组态王参数设置 341 12.1.1 RS-485板卡的使用方法 341 12.1.2 串口通信方式 342 12.1.3 串口参数设置 346 12.2 组态王通信协议 346 12.2.1 寄存器定义 346 12.2.2 读命令格式 347 12.2.3 写命令格式 347 12.2.4 命令格式中的符号说明 348 12.2.5 命令举例说明 349 12.3 组态王端的程序设计 350 12.3.1 程序功能 350 12.3.2 界面设计 350 12.3.3 KingComClient设备的设置 352 12.3.4 变量定义 352 12.3.5 命令语言 353 12.4 计算机端的程序设计 353 12.4.1 功能描述 353 12.4.2 界面设计 354 12.4.3 变量/函数声明 355 12.4.4 初始化代码 356 12.4.5 串口配置与操作 357 12.4.6 串口事件响应函数 361 12.4.7 自定义功能函数 368 12.4.8 模拟数值的产生 372 12.4.9 实际通信截图 372 12.5 小结 374 第13章 云台及镜头控制系统 375 13.1 云台及镜头的应用概况 375 13.1.1 数字监控系统概述 375 13.1.2 监控系统组成 375 13.2 如何控制云台与镜头 376 13.2.1 云台及镜头的设备简介 376 13.2.2 云台及镜头的控制原理 377 13.2.3 解码器概述 377 13.2.4 常用通信协议 377 13.3 串口控制云台和镜头程序设计 378 13.3.1 硬件接线说明 378 13.3.2 通信协议介绍 379 13.3.3 程序功能 380 13.3.4 界面设计 380 13.3.5 变量/函数声明 383 13.3.6 初始化操作 386 13.3.7 按下与弹起控制的实现方法 388 13.3.8 串口操作 407 13.3.9 发送数据 408 13.3.10 程序测试截图 417 13.4 小结 417 附录 串口调试 419
w25x16 SPI FLASH读写 串口监测输出STC8A8K单片机KEIL工程文件源码 FLASH w25x16 2M外部flash测试 W25X16芯片,就是16Mbit 一byte等于8bit 也就是2M字节的存储空间。 256bytes为一页 4Kbytes为一个Sector (扇区) 16个扇区为1个Block (块) W25X16 容量为2M字节,共有32个Block,512个Sector 而且W25X16最小擦除量是一个扇区 即4k字节空间 W25X16擦写周期多达 10W次,具有 20年的数据保存期限, 支持电压为 2.7~3.6V ,最大SPI 钟可以到80Mhz。 程序上是将一个字符串存到了flash地址100开始的位置,然后去读取存入的数据到数组中,在将读到的 数组数据其显示出来 整个过程由串口检测 主频为11.0592MHz 串口波特率为9600 */ #include "stc8.h" //STC15头文件 #include "def.h" //宏定义 常用函数 #include "delay.h" //函数 #include "spi.h" #include "flash.h" #include "uart.h" u8 scan[]={"STC8 FLASH test"}; //测试字符串 u8 buffer[19]; //接收数组 void main() { SP=0X80; //调整堆栈指向 手册286页 详解 Init_SPI(); //SPI初始化 UartInit(); //串口初始化 if(SPI_Flash_ReadID()==0xef14) UartSendStr("外部FLASH初始化成功!\r\n"); else { UartSendStr("外部FLASH初始化失败!\r\n"); while(1); } SPI_Flash_Erase_Sector(0); //擦除地址为0扇区 4k字节 SPI_Flash_Write_NoCheck(scan,100,15); //在地址100位置写入字符串 SPI_Flash_Read(buffer,100,16); //在地址100位置处读取字符串并存入buffer数组中 UartSendStr("地址100数据:\r\n"); UartSend(buffer,15); while(1); }
328254178Msp430F149.rar AD_DA.rar e96e317f-d9ab-41e5-b87f-ebc3f6131c4b.zip MSP430-149单片机应用实例(USB实例).rar MSP430-F149对应的液晶程序(描述详细,易于调用).rar MSP430F149 AD转换C程序.rar MSP430F149 C语言驱动DS18B20.zip MSP430F149 GSM基本控制,初始化接收短息,解读短信.rar MSP430F149+1602数码显示和实钟.rar MSP430F149+DS1302+UART程序可以用.rar MSP430F149,IAR,ADC采样之后对太阳点光源进行跟踪.rar MSP430F149--485串行通信.rar MSP430F149-SHT15传感器例程(,随调用,含注释) (1).rar MSP430F149-SHT15传感器例程(,随调用,含注释).rar MSP430F149下的s级别,us级别,ms级别.rar MSP430F149单片机与RF2401硬件SPI无线通信 (1).zip MSP430F149单片机与RF2401硬件SPI无线通信.zip MSP430F149单片机器A的PWM输出程序.rar MSP430F149单片机对1602液晶进行的简单测试.rar MSP430F149单片机对1604液晶进行的简单操作.rar MSP430F149单片机对PS2键盘的控制程序和源码.rar MSP430F149单片机对继电器的控制程序和源码.rar MSP430F149单片机控制LED全彩显示屏的某一行列数据传输控制显示程序.rar MSP430F149单片机模拟IIC和DS18B20通信进行测试温度代码.rar MSP430F149单片机的Flash程序.rar MSP430F149可以通过串口显示温度传感器的数值.rar MSP430F149开发板例程(控制8个LED闪烁).rar MSP430f149控制LCD12864显示汉字、字母.zip MSP430F149温度测量.zip MSP430F149的无线模块24L01程序.rar MSP430F149跑ADC和USB好用的代码.rar MSP430F149通过SPI接口控制ADS1216.zip MSP430x14x控制SED1335驱动320×240屏.rar MSP430x14x系列单片机实现了对EEPROM的读写测试.rar MSP430内置温度传感器的C语言程序.zip MSP430单片机 串口像PC发送数据.rar MSP43F149的USB测试程序.rar mulu.txt RF24L01-AD.rar RF24L01-MCU-PC通信例程.rar RF24L01-PC-MCU通信例程.rar RF24L01无线温度例程.rar RF24L01遥控例程.rar 基于MSP430F149为主芯片下的红外线解码资料源程序.zip 基于MSP430F149单片机中看门狗电路的中断实验.zip 基于MSP430F149单片机的1602程序代码.zip 基于MSP430F149单片机的nRF24L01无线通信程序.rar 基于MSP430F149单片机串口0驱动程序.rar 基于MSP430F149单片机的温湿度传感器SHT1X驱动程序.rar 基于MSP430F149的12864的显示图片.rar 基于MSP430F149的数字钟源代码(以1602LCD液晶显示).rar 基于MSP430F149的触摸手写程序.zip 展示了MSP430F14x单片机的AD操作.rar 德州仪器MSP430F1449-F169的LCD12864测试程序 (1).rar 德州仪器MSP430F1449-F169的LCD12864测试程序.rar 德州仪器MSP430F149-F169初学者常用代码.rar 演示了如何操作MSP430F149单片机的DMA操作.rar 演示了如何操作MSP430F149的I2C功能.rar

27,375

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧