完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
` Elecfans论坛高手问答第1期 朱兆琪在线解答单片机C语言编程 本期高手问答(6月30日-7月6日)我们请来了 @zzq宁静致远 为大家解答关于单片机C语言编程方面的问题。 @zzq宁静致远 朱兆琪,我相信大家不陌生。目前深圳市馒头科技有限公司总经理,在论坛连载多个技术贴,从C语言到STM32到蓝牙4.0,引起大家的强烈反响,熟知嵌入式开发。著有《嵌入式Linux开发实用教程》一书,关于朱兆琪,点此了解更多 Elecfans高手问答一贯的风格,不欢迎任何与主题无关的讨论和喷子。 下面欢迎大家就单片机C语言编程方面问题向 @zzq宁静致远 提问,请直接在回帖中提问。 为了鼓励大家踊跃提问,特准备两本《嵌入式Linux开发实用教程》作为幸运奖品,届时将有 @zzq宁静致远 从所有提问者中抽取赠予此书。 |
|
相关推荐
68个回答
|
|
ModBus RTU 协议上规定其帧数据有:地址码、功能码、数据、CRC,并没有定义帧起始、帧结束,资料上说,以3.5个字符作为界定帧起始、帧结束。那这个在程序上怎么实现呢?
看了一些别人的帖子,有说如下解决: 在下位机上,启动一个定时器,定时器中断时间大于3.5个字符的时间,每次接收到一个字节数据,都会将定时器清零,若超过该时间,就会发生定时中断。 对此,我还是不明白,如下: 1. 这个3.5个字符传输时间,是传输3个bit时间,还是3个byte的时间,或者是其他的?手册上写的是3个char,这个char指的是什么? 2. 不明白怎么界定3.5字符超时限制。如果这个3.5字符时间是大于传输一个字节的时间,那我可以在每次接收到一个字节是数据,都对定时器清零,当没有数据传输时,定时器会产生时间中断,这样能界定这个超时,从而判断帧传输结束。但是若3.5字符时间是 小于 传输一个字节的时间,这种方法就实现不了? 另外,在上位机 VC上怎么实现?上位机上用定时器,其优先级很低,是不可以作为超时限制的,其二,VC上需要调用API,然后做差值,来确定精确的 ms 级别时间。但是该从什么时候开始调用API呢?也就是说,我从什么时候开始判断,没有字符接收了,然后调用API,获取时间来判断是否超时3.5字符? 求朱老师 @zzq宁静致远 指点 |
|
|
|
|
|
|
|
本帖最后由 zzq宁静致远 于 2014-7-1 11:36 编辑
1.3byte 2.如果低于3.5字符时间,说明帧还没有结束(这个是modbus RTU协议规定的) 另外:3.5字符时间只是最低时间,并不需要准确的,所以,VC上面也是可以实现这个定时的,只要误差不会超过10ms,都是没有问题的 |
|
|
|
个人风格的编程思想。 |
|
|
|
|
|
|
|
看别人写的c程序中把带返回值的函数,不同情况返回三种值return 0,return 1,return -1。但是整个过程好像没调用这些值。这样写是为什么啊?
|
|
|
|
本帖最后由 cedaisong 于 2014-7-1 18:32 编辑
这里发不了网页地址,没办法直接给你对应课程的网页地址,我直接把PDF上传上来。你可以看看我的教程的13课《实用串口通信例程》以及18课《485RS5通信和Modbus协议》中专门讲了这种问题的解决方式,并且里边也都有专门的源代码的逻辑。 配套视频可以看11课,13课,18课。我把整个电子文档的PDF发上来给你参考一下。你可以选取和串口通信有关的章节进行学习。11课串口是讲的演示实验,原理。13课就讲实际项目开发的用法,18课的485和UART通信机制类似的,都可以参考。 PDF版本: 视频种子文件: |
|
|
|
问 @zzq宁静致远 朱老师一个问题
void delay() { ;; } //里面有两个空格和两个逗号 这是一个延时程序,郭天祥的教材上这么说的 大约延时5us左右 我有一下几点不太明白 1.大括号内的逗号是不是必须的,用空格代替行吗 2.这个程序的延时5us是怎么算的,全是空格或者全是逗号行吗 3.用其它的符号代替行吗 |
|
|
|
PIC单片机C语言编程,数组问题
各位高手: 我用的是PIC16F877的单片机,使用C语言编程,用来驱动1602的LCD显示器以及完成一些对按健开关的判定和作出相应的反应,因为主要是驱动液晶显示器,所以有大量的文字需要显示。我把所有文字都放在数组中,每个数组有16个字母整个程序中大约有80个左右数组,程序写好进行编译时出现如下提示,经查意为“数组代码溢出了”请教高手如何在PIC单片机中编写有大量文字的程序。 Error[1347] ; 0. can't find 0x9 words (0x9 withtotal) for psect "text1913" in segment "CODE" (largest unused contiguous range 0x8) 求朱老师 @zzq宁静致远 指点 |
|
|
|
thanks for sharing! |
|
|
|
yangjiawei1223 发表于 2014-7-1 16:19 只要不是void函数,都应该有返回值。 1.返回一个应该的值 int Fun(void) { return 100; } 这是调用这个函数的时候应该返回的值 2.int main(int argc, char *argv[]) { return 0; } 这里虽然返回0没有实际意义,但是必须返回,其一是int类型函数,其二为了程序的逻辑更加清楚 还有很多种情况,您可以去了解下。 |
|
|
|
程序执行指令的时间,建议了解清楚时钟周期、机器周期等等概念 |
|
|
|
应该是你全局变量定义问题,这个问题我让吴坚鸿老师老师给您回复下。PIC我没有使用过,不知道是否存在区别。 |
|
|
|
赞一个,还不错的样子
|
|
|
|
朱总让我来回答你这个问题。这个编译出错,往往是由两个地方引起。 第一个:就是const 定义的常量数据太庞大了的,你要把一个大的常量数组分成若干个小常量数组。然后再通过编程把这些若干个常量数组整合起来。 第二个:就是某个函数里面的代码太庞大了。要把里面的代码分成若干个子函数,再把这若干个子函数包含在一个函数里。 综上所述,引起这个问题的根本原因是PIC单片机的编译器PICC还不能做到非常智能,每个常量数组或者每个函数的代码大小都有所限制的,不能超过某个值。 |
|
|
|
多谢吴老师的指导 |
|
|
|
单片机局限性 |
|
|
|
|
|
|
|
朱老师 @zzq宁静致远 看过你的剩者为王之后感触颇深,我个人有几个问题想跟你探讨一下。问题比较基础请见谅哈!首先是const定义的数组我看他们说 const定义的数组省内存 怎么个什么法 如果要省内存直接定义为code不就得了直接去了rom不是更省内存. 还有就是c语言的变量不是需要内存吗, 单片机是怎么分配内存的,是把写好的程序放进单片机让后用程序指针一条一条的指,如果发现有变量就分配内存 还是在Keil 软件中编译时就分好了那些因该是放在内存中,那些是放在rom中.
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
【RA-Eco-RA2E1-48PIN-V1.0开发板试用】(第三篇)ADC采集+PWM输出
515 浏览 0 评论
《DNK210使用指南 -CanMV版 V1.0》第四十五章 人脸识别实验
515 浏览 0 评论
780 浏览 0 评论
如何用OpenCV的相机捕捉视频进行人脸检测--基于米尔NXP i.MX93开发板
1360 浏览 0 评论
《DNK210使用指南 -CanMV版 V1.0》第四十章 YOLO2人手检测实验
572 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
11755 浏览 31 评论
浏览过的版块 |
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-21 16:40 , Processed in 0.983751 second(s), Total 80, Slave 72 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号