要求单片机发送一个字节的数据给上位PC机,数据可以发送,但PC机接收到的数据有些不是我设的那个数据,例如发送21H,接收的数据有时为41H,有时为61H。
用的单片机是MC68HC908SR12C,内部总线频率是8MHz,采用的波特率是9600,部分程序如下:
MOV #%00110000,SCBR ;设置波特率是9600(8000000/(64*13*1))
MOV #%01000000,SCC1 ;设置允许SCI,正常码输出、8位数据、无校验
MOV #%00001100,SCC2 ;设置允许发送、允许接收,查询方式收发
MAINLOOP:
LDA #$21
BRCLR 7,SCS1,* ;SCS1.7=0? 为0则等待
STA SCDR ;否则发送数据
BRCLR 1,FLAG,* ;延时400ms
BCLR 1,FLAG
JMP MAINLOOP
另外我用的是COMTOOLS做为串口调试工具,接收数据时提示帧错误,不知道是什么意思?
我才学单片机不久,还请各位高手赐教一下
8M的时钟怎么分出来9600的波特率的?好像不准吧。
串口发送注意以下设置:
波特率
校验位
数据位
停止位
这些参数都要注意,收发一致。
尽量排除一些物理上不稳定因素,比如接触不良,物件的摆放等等
引用: 引用 2 楼 jennyvenus 的回复:
8M的时钟怎么分出来9600的波特率的?好像不准吧。
是不准,分出来大约是9615,但串行通信好像有一定的容错空间吧,错一点应该没什么问题
引用: 引用 1 楼 yangb_soso 的回复:
示波器。。。
我是想用示波器来着,但感觉挺麻烦,芯片上的引脚那么小,好像不太好引出来测波形
引用: 引用 3 楼 jiazhen 的回复:
串口发送注意以下设置:
波特率
校验位
数据位
停止位
这些参数都要注意,收发一致。
尽量排除一些物理上不稳定因素,比如接触不良,物件的摆放等等
物理上的问题应该不会,因为我换过几个实验箱,结果都是这种现象,我估计可能是那几个参数的问题,因为我对波特率和停止位的设置拿不准,波特率是从8M分出来的,与标准总有点误差,心里总觉得这里会出问题;而那个停止位我在3个控制寄存器上瞅了好几遍也没发现哪个是设置停止位的,不知道这款单片机是不是不用设置停止位
另外补充一下,传输的数据出错的地方总是高四位,而低四位始终是正确的,挺奇怪的
误差会累加。。。比如你波特率误差5%,那么累积到最后一位数据就会误差45%
要严谨,不要不求甚解。。。
串口波特率还是用那种标准的好,不然出来的数据容易出错!
起始位,校验位,数据位,停止位,这个是看你设置的模式啊
SCON中的
SM0,SM1 工作方式
0 0 方式0 8位
0 1 方式1 10位
1 0 方式2 11位
1 1 方式3 11位
我也想用标准的波特率,但8M的频率没法分出标准的呀
这个单片机好像没有设置工作方式的,只有三个控制寄存器,就下面三个寄存器
不好意思,发了两个SCC1寄存器的定义,第三个寄存器SCC3的定义如下:
今天去请教老师了,老师给了我一个示例程序,结果发送数据还是出错,再去找老师,老师一听也晕了,说有空了帮我看下,唉~~~~~,咋就这么难
老师也问我发送0x55是什么了,这能说明什么问题吗?发送0x55收到的是0x95或0xB5.0xaa还没试过。
什么是大小端?
发送0x55/0xAA的意义在于,
你可以从示波器上读出实际波特率。。。
0x55==0101 0101 0xaa==1010 1010;
这样就能看出你的数据是在第几位发生错误了.
很显然0x95==1001 0101 0xb5==1011 0101;
是从第六位开始发生错误.可能是程序的原因,自己再试着调试看看.