本帖非活动贴,我们将活动中的Q&A做了整合,方便大家共同学习。
tica, Tahoma, Arial, sans-serif">
Elecfans社区问答已经在大家的积极参与下全面展开,我们会在每一期活动结束后,将帖子中的精华问答整合于此,方便大家翻阅,共同学习,共同进步。
************************为了给大家一个方便的阅读环境,请不要在本帖回复,谢谢配合***********************
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
Q&A精华Q: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宁静致远 指点A:1.3byte
2.如果低于3.5字符时间,说明帧还没有结束(这个是modbusRTU协议规定的)
另外:3.5字符时间只是最低时间,并不需要准确的,所以,VC上面也是可以实现这个定时的,只要误差不会超过10ms,都是没有问题的
Q:看别人写的c程序中把带返回值的函数,不同情况返回三种值return 0,return 1,return -1。但是整个过程好像没调用这些值。这样写是为什么啊?A:只要不是void函数,都应该有返回值。
1.返回一个应该的值
intFun(void)
{
return 100;
}
这是调用这个函数的时候应该返回的值
2.int main(intargc, char *argv[])
{
return 0;
}
这里虽然返回0没有实际意义,但是必须返回,其一是int类型函数,其二为了程序的逻辑更加清楚
还有很多种情况,您可以去了解下。
Q:问 @zzq宁静致远 朱老师一个问题voiddelay(){ ;; }//里面有两个空格和两个逗号,这是一个延时程序,郭天祥的教材上这么说的 大约延时5us左右 我有一下几点不太明白 1.大括号内的逗号是不是必须的,用空格代替行吗 2.这个程序的延时5us是怎么算的,全是空格或者全是逗号行吗 3.用其它的符号代替行吗A:程序执行指令的时间,建议了解清楚时钟周期、机器周期等等概念
Q: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 contiguousrange 0x8)
求朱老师 @zzq宁静致远 指点A1:应该是你全局变量定义问题,这个问题我让吴坚鸿老师老师给您回复下。PIC我没有使用过,不知道是否存在区别。A2:朱总让我来回答你这个问题。这个编译出错,往往是由两个地方引起。
第一个:就是const 定义的常量数据太庞大了的,你要把一个大的常量数组分成若干个小常量数组。然后再通过编程把这些若干个常量数组整合起来。
第二个:就是某个函数里面的代码太庞大了。要把里面的代码分成若干个子函数,再把这若干个子函数包含在一个函数里。
综上所述,引起这个问题的根本原因是PIC单片机的编译器PICC还不能做到非常智能,每个常量数组或者每个函数的代码大小都有所限制的,不能超过某个值。
Q:刚刚接触单片机这块,比较白,勿喷啊!想问问朱老师单片机C语言与标准C语言有区别嘛? @zzq宁静致远A: 单片机的C语言和标准的C语言有什么区别?就像广东人讲的普通话跟标准的普通话有什么区别一样,广东人讲的普通话会带有地方特 {MOD},有地方口音。但是大体上跟标准普通话没有大的差别。单片机的C语言主要目的是用来开发单片机,它在标准C语言的基础上,会增加若干条专用指令,也会减少标准C语言部分原有的指令功能,它是专门为某个单片机定制的C语言。比如C51的编译器,就多增加了一条操作硬件IO口的指令 sbitxx = P1^0;另外,不同厂家的单片机,它们的C语言编译器所支持的C语言也会有略微的差别,但是差别不大。比如C51定义的常量是用code关键字,而PIC单片机各系列的编译器PICC,PIC18,C30等则用const关键字来定义常量。
Q: 朱老师 @zzq宁静致远 看过你的剩者为王之后感触颇深,我个人有几个问题想跟你探讨一下。问题比较基础请见谅哈!首先是const定义的数组我看他们说 const定义的数组省内存 怎么个什么法 如果要省内存直接定义为code不就得了直接去了rom不是更省内存. 还有就是c语言的变量不是需要内存吗, 单片机是怎么分配内存的,是把写好的程序放进单片机让后用程序指针一条一条的指,如果发现有变量就分配内存 还是在Keil 软件中编译时就分好了那些因该是放在内存中,那些是放在rom中.A: (1)const和code这两个关键字的意义是一样的。只是在51单片机里面定义常量用code,而在pic,stm32等单片机里面,定义常量用const。名字虽然不一样,但是用法完全一样。
(2)我们平时定义的数据,如果前面带了code或者const,那么编译就会把他分配到ROM区,放到ROM区的数据只能读,不能改写,掉电后重新上电数据不丢失。如果不带code或者const的 数据,那么编译就会把他分配到RAM区,RAM区的数据可以读,也可以改写,掉电后重新上电数据会丢失。
(3)存在ROM区的内容有凡是带code或者const关键字的常量。以及我们写的if,for,whle等指令程序。
(4)存在RAM区的内容有凡是没有带code或者const关键字的全局变量和局部变量。
(5)RAM区的容量比ROM区的容量小很多。比如常用的51单片机,RAM区只有256个字节左右,而ROM区却有8K字节那么多。所以一般不用更改的数据前面都带code或者const关键字,都放在ROM区,比如数码管程序中的字模数组都带code或者const关键字。
(6)在单片机中,RAM区是宝贵的稀缺资源,我们要且行且珍惜。
Q:请教老师一个8051单片机用C语言驱动两相四线步进电机的问题:
如何实现单片机接收到电脑送来的一个高电平步进电机就只转动一个步进角.A : 其实你这个问题不好回答,因为很笼统。分两种情况:
(1)大部分的实战系统,单片机驱动步进电机的时候,都不会直接去驱动的,单片机与步进电机之间还会用专门的驱动芯片,单片机只要把一个上升沿或者下降沿的脉冲给驱动芯片,驱动芯片就会自动让步进电机转动一个步距角。
(2)如果是单片机直接经过mos管来驱动步进电机,那么就要写一些驱动程序,这个程序应该不难,网上有很多参考资源,你可以在百度上找找看。
Q: 看别人写的c程序中把带返回值的函数,不同情况返回三种值return 0,return 1,return -1。但是整个过程好像没调用这些值。这样写是为什么啊?A: 对于函数,凡是带void关键字开头的,都不用return 具体的数值,也可以不用写return。凡是不带void关键字的,为了保持C语言的标准写法,后面都会加一个return 返回某个具体的数值,至于这个数值用不用没关系,把它写出来的目的本来就是当花瓶用的,为了维持C语言结构的对称性,所以不用太纠结这个问题。
一周热门 更多>