单片机/MCUwilliam hill官网
直播中

vvg

14年用户 7898经验值
擅长:嵌入式技术,控制/MCU
私信 关注
[问答]

【高手问答】第1期——朱兆琪在线解答单片机C语言编程

`
Elecfanswilliam hill官网 高手问答第1期

朱兆琪在线解答单片机C语言编程

本期高手问答(6月30日-7月6日)我们请来了 @zzq宁静致远  为大家解答关于单片机C语言编程方面的问题。

@zzq宁静致远  朱兆琪,我相信大家不陌生。目前深圳市馒头科技有限公司总经理,在william hill官网 连载多个技术贴,从C语言到STM32到蓝牙4.0,引起大家的强烈反响,熟知嵌入式开发。著有《嵌入式Linux开发实用教程》一书,关于朱兆琪,点此了解更多


Elecfans高手问答一贯的风格,不欢迎任何与主题无关的讨论和喷子。

下面欢迎大家就单片机C语言编程方面问题向 @zzq宁静致远 提问,请直接在回帖中提问。


为了鼓励大家踊跃提问,特准备两本《嵌入式Linux开发实用教程》作为幸运奖品,届时将有 @zzq宁静致远 从所有提问者中抽取赠予此书。


QQ截图20140702161748.jpg
*****************问答精华***********************



Elecfans高手问答往期回顾:






` QQ截图20140702161646.jpg

回帖(68)

小萃米

2014-6-30 18:32:28
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宁静致远  指点
1 举报

陈崇尧

2014-6-30 18:40:02
关于C语言单片机编程有哪些思想是平常书本、视频教程学习中接触不到的。 @zzq宁静致远
举报

朱兆祺

2014-7-1 11:25:47
本帖最后由 zzq宁静致远 于 2014-7-1 11:36 编辑
引用: 小萃米 发表于 2014-6-30 18:32
ModBus RTU 协议上规定其帧数据有:地址码、功能码、数据、CRC,并没有定义帧起始、帧结束,资料上说,以3. ...

1.3byte
2.如果低于3.5字符时间,说明帧还没有结束(这个是modbus RTU协议规定的)
另外:3.5字符时间只是最低时间,并不需要准确的,所以,VC上面也是可以实现这个定时的,只要误差不会超过10ms,都是没有问题的

举报

朱兆祺

2014-7-1 11:26:29
引用: IEXWER 发表于 2014-6-30 18:40
关于C语言单片机编程有哪些思想是平常书本、视频教程学习中接触不到的。 @zzq宁静致远 ...

个人风格的编程思想。
举报

木頭瓶子

2014-7-1 13:45:42
@zzq宁静致远 朱老师一个关于混合编程的问题:如果我要在汇编程序中加入C语言段怎么处理?如果要在C语言段里加入汇编又要如何处理?
举报

yangjiawei1223

2014-7-1 16:19:14
看别人写的c程序中把带返回值的函数,不同情况返回三种值return 0,return 1,return -1。但是整个过程好像没调用这些值。这样写是为什么啊?
举报

cedaisong

2014-7-1 18:20:07
本帖最后由 cedaisong 于 2014-7-1 18:32 编辑
引用: 小萃米 发表于 2014-6-30 18:32
ModBus RTU 协议上规定其帧数据有:地址码、功能码、数据、CRC,并没有定义帧起始、帧结束,资料上说,以3. ...

这里发不了网页地址,没办法直接给你对应课程的网页地址,我直接把PDF上传上来。你可以看看我的教程的13课《实用串口通信例程》以及18课《485RS5通信和Modbus协议》中专门讲了这种问题的解决方式,并且里边也都有专门的源代码的逻辑。 配套视频可以看11课,13课,18课。我把整个电子文档的PDF发上来给你参考一下。你可以选取和串口通信有关的章节进行学习。11课串口是讲的演示实验,原理。13课就讲实际项目开发的用法,18课的485和UART通信机制类似的,都可以参考。
PDF版本:
视频种子文件:


2 举报

迷你洼哇

2014-7-2 14:05:16
@zzq宁静致远 朱老师一个问题
void delay()
{ ;; } //里面有两个空格和两个逗号

这是一个延时程序,郭天祥的教材上这么说的 大约延时5us左右 我有一下几点不太明白 1.大括号内的逗号是不是必须的,用空格代替行吗 2.这个程序的延时5us是怎么算的,全是空格或者全是逗号行吗 3.用其它的符号代替行吗
举报

技术牛人小渣子

2014-7-2 14:15:25
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宁静致远   指点
举报

mikeboy

2014-7-2 15:17:41
引用: cedaisong 发表于 2014-7-1 18:20
这里发不了网页地址,没办法直接给你对应课程的网页地址,我直接把PDF上传上来。你可以看看我的教程的13课 ...

thanks for sharing!

举报

朱兆祺

2014-7-2 16:06:14
引用: yangjiawei1223 发表于 2014-7-1 16:19
看别人写的c程序中把带返回值的函数,不同情况返回三种值return 0,return 1,return -1。但是整个过程好像 ...

只要不是void函数,都应该有返回值。

1.返回一个应该的值
int Fun(void)
{
    return 100;
}
这是调用这个函数的时候应该返回的值

2.int  main(int argc, char *argv[])
{
    return 0;
}
这里虽然返回0没有实际意义,但是必须返回,其一是int类型函数,其二为了程序的逻辑更加清楚


还有很多种情况,您可以去了解下。
举报

朱兆祺

2014-7-2 16:07:36
引用: 迷你洼哇 发表于 2014-7-2 14:05
问 @zzq宁静致远 朱老师一个问题
void delay()
{ ;; } //里面有两个空格和两个逗号

程序执行指令的时间,建议了解清楚时钟周期、机器周期等等概念
举报

朱兆祺

2014-7-2 16:10:24
引用: 技术牛人小渣子 发表于 2014-7-2 14:15
PIC单片机C语言编程,数组问题
各位高手:
我用的是PIC16F877的单片机,使用C语言编程,用来驱动1602的LCD ...

应该是你全局变量定义问题,这个问题我让吴坚鸿老师老师给您回复下。PIC我没有使用过,不知道是否存在区别。
举报

佩佩猪

2014-7-2 16:14:21
赞一个,还不错的样子
举报

吴坚鸿

2014-7-2 16:30:28
引用: 技术牛人小渣子 发表于 2014-7-2 14:15
PIC单片机C语言编程,数组问题
各位高手:
我用的是PIC16F877的单片机,使用C语言编程,用来驱动1602的LCD ...

朱总让我来回答你这个问题。这个编译出错,往往是由两个地方引起。
第一个:就是const 定义的常量数据太庞大了的,你要把一个大的常量数组分成若干个小常量数组。然后再通过编程把这些若干个常量数组整合起来。
第二个:就是某个函数里面的代码太庞大了。要把里面的代码分成若干个子函数,再把这若干个子函数包含在一个函数里。
综上所述,引起这个问题的根本原因是PIC单片机的编译器PICC还不能做到非常智能,每个常量数组或者每个函数的代码大小都有所限制的,不能超过某个值。
举报

技术牛人小渣子

2014-7-3 09:30:18
引用: jianhong_wu 发表于 2014-7-2 16:30
朱总让我来回答你这个问题。这个编译出错,往往是由两个地方引起。
第一个:就是const 定义的常量数据太 ...

多谢吴老师的指导
举报

匿名

2014-7-3 09:32:54
引用: jianhong_wu 发表于 2014-7-2 16:30
朱总让我来回答你这个问题。这个编译出错,往往是由两个地方引起。
第一个:就是const 定义的常量数据太 ...

单片机局限性
举报

芒果冰

2014-7-3 10:18:50
刚刚接触单片机这块,比较白,勿喷啊!想问问朱老师单片机C语言与标准C语言有区别嘛? @zzq宁静致远
举报

二霸

2014-7-3 10:26:59
朱老师 @zzq宁静致远 看过你的剩者为王之后感触颇深,我个人有几个问题想跟你探讨一下。问题比较基础请见谅哈!首先是const定义的数组我看他们说   const定义的数组省内存    怎么个什么法  如果要省内存直接定义为code不就得了直接去了rom不是更省内存.  还有就是c语言的变量不是需要内存吗,  单片机是怎么分配内存的,是把写好的程序放进单片机让后用程序指针一条一条的指,如果发现有变量就分配内存  还是在Keil 软件中编译时就分好了那些因该是放在内存中,那些是放在rom中.

举报

更多回帖

发帖
×
20
完善资料,
赚取积分