打印

PC机与单片机通讯,返回数据出乱

[复制链接]
2588|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
hsb.siq|  楼主 | 2009-9-11 15:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
PC机用C#写的,同时用串口调试软件也试了.
1.PC机校验位设置为NO,单片机用串口模式1(一帧10位)进行,PC和单片机协议按MODBUS进行,通讯有时出现PC机发送1号机的地址,却返回2号机的数值.
2.单片机用串口模式3进行,SM2设置为1,PC机发送的第一帧只要跟单片机的地址相同,不管校验位用什么值,都会出现中断,但通不过CRC校验.
3.单片机用串口模式3进行,SM2设置为1,PC机发送的第一帧跟单片机的地址相同,数据位里面有与单片机的的地址相同,有时也会出现单片机中断(当然通不过CRC校验).不知什么原因?

相关帖子

沙发
chunyang| | 2009-9-11 16:40 | 只看该作者
MCU部分的程序有错。

使用特权

评论回复
板凳
hsb.siq|  楼主 | 2009-9-13 03:02 | 只看该作者
真找不出哪里有问题
贴部分程序,芯片:P89LPC935,设置
        MOV     SSTAT,#00H      ;双缓冲禁止,中断禁止,采用查询方式发送和接收
        MOV     SCON,#0F0H      ;串口模式3,接收使能
;通讯中断程序
SSIO:   PUSH    ACC
        PUSH    PSW
        JB      TI,RETURN
        SETB    RS0             ;选择工作寄存器1
        CLR     RI
        MOV     A,SBUF
        JZ      SSN1            ;广播地址,从机都接收
        XRL     A,45H           ;是否为本机地
        JNZ     RETURN          ;不是本机地址返回
SSN1:   CLR     SM2             ;允许数据接收中断
        NOP

        CPL     P2.1

        NOP
        JNB     RI,$
        CLR     RI
        MOV     51H,SBUF        ;存功能码
        MOV     A,51H
        CJNE    A,#03H,SSN2
        JMP     TX
SSN2:   CJNE    A,#06H,SSN3
        JMP     RXSIDA
SSN3:   CJNE    A,#05H,FUN_E
        JMP     ONOFF
FUN_E:  nop
        JMP     RETURN          ;其它为非**能码
CRC_E:  nop                     ;CRC出错处理

RETURN: SETB    SM2
        CLR     P0.6
        CLR     RS0             ;返回工作寄存器0
        CLR     TI
        CLR     RI
        POP     PSW
        POP     ACC
        RETI

TX:  ........
       JMP       RETURN
RESIDA:   ..............
       JMP       RETURN
ONOF:  ........
       JMP       RETURN

使用特权

评论回复
地板
hsb.siq|  楼主 | 2009-9-13 03:35 | 只看该作者
可能是PC程序问题

使用特权

评论回复
5
李冬发| | 2009-9-13 09:10 | 只看该作者
这类东西本不是问题啊。
你确定了:
1、MCU发至PC的数据,是否能被PC正确接收?
2、PC发至MCU的数据,是否能被MCU正确接收?
3、PC发的帧格式是否正确?
4、MCU发的帧格式是否正确?

使用特权

评论回复
6
cauhorse| | 2009-9-13 09:39 | 只看该作者
哪个版本的C#?是否直接利用的SerialPort控件?

使用特权

评论回复
7
hsb.siq|  楼主 | 2009-9-14 00:51 | 只看该作者
本帖最后由 hsb.siq 于 2009-9-14 00:54 编辑

在一帧10位的情况下大都能正确发送接收,就是有时会出现发1从机地址却收到2从机的数据,所以就想用一帧11位来确定地址.
今天又下了几个串口调试软件,发现Parity设置为space时,发送首位数据与从机地址相同,有的也会引起单片机中断,有的却不能.
我的程序不管Parity怎么设置,只要第一位数据和从机地址相同,都会能引起单片中断.可能是PC程序问题吧,C#是2008版,我也是新手,用的是kernel32.dll中的相关API控件.FParity设置1也不行.
可能是PC机的Parity处理得不好吧,继续找原因.

使用特权

评论回复
8
李冬发| | 2009-9-14 09:37 | 只看该作者
"一帧10位的情况下大都能正确发送接收..."
你的帧同步是怎么做的呢?你是如何确定一个帧是完整合法的帧的?这个很重要,估计你在这里出错了。
你要发往1#机的包被2#机收走了,这显然是你的2#机把帧解错了,1#机没反应?肯定没反应,同一个程序,它也错了,也以为是2#机的,不是自己的。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

75

主题

232

帖子

2

粉丝