导航: 老古网老古论坛XMOS公共讨论区XMOS开源项目区单片机程序设计嵌入式系统广告区域
→pc机与51的数据传输问题[sdgaga]

 *第23751篇: pc机与51的数据传输问题

  
楼 主:sdgaga 2004年7月15日14:24
 pc机与51的数据传输问题
各位大虾:我现在要做一个51与pc机用串口通讯的问题,需要pc机向51发2k的数据,51收到后将数据存到外扩得ram 62256里。连续发送接受可以么?如果不行怎么解决这个问题呢?特别是中断处理程序怎么做呢?我比较熟悉汇编。怎么防止数据丢失呢?
请各位大侠提个思路吧,谢谢

  
2楼:justrong 2004年7月15日15:28
 还是分成定长的数据包吧,数据包定义一个字
还是分成定长的数据包吧,数据包定义一个字节的头,一个字节命令码,一个字节的长度,之后为长度字节所指定长度的数据,最后为一个或两个字节的校验码(简单的可用累加和校验或异或和校验,复杂的就用CRC吧)。中断程序中判断头以及命令码后再接收的就是长度了,然后根据这个长度再接收长度加1或2个字节的数据就完成本包的接收了。接收一个数据之后最好PC机一个应答数据包,PC收到这个应答数据包后在传送下一个包直到结束。
本人在IAP中更新的程序就是这样处理的。当然数据包中也可定义一个第N包的数据,则应答时也应答是第N包。在此仅为抛砖引玉,你也可以发挥。
  
3楼:sdgaga 2004年7月16日10:05
 我做的简单的串口程序
之前我没有用过单片机的串口,所以为了完成这个作业,我先做了小的测试程序来熟悉串口。我从网上下载的串口调试工具,单片机的程序是收到8个字节存储再将其发出,但是我观察存储空间值没有变,pc机也收不到回应,请指教,谢谢
ORG 0000H
jmp START
org 0023h
jmp fj
org 0080h
START:
    mov tmod,#20h  ;串口通讯设置 串口方式1 波特9600 晶振11.0592
                   ;pc方设置:9600/DB8/none/停止位1
    mov Tl1,#0fDh 
    mov th1,#0fDh  
    mov pcon,#00h 
    mov sp,#60h
    mov scon,#050h
    clr  et1
    setb tr1
    setb ea
    setb es
other:mov r1,#31h
      mov r2,#08h
     setb ren

 pan: cjne r2,#00h,pan
   clr ren
      mov r2,#08h
      mov r1,#31h
  fa: mov a,@r1
      mov sbuf,a
      inc r1
      dec r2
      cjne r2,#00h,fa
     
      
      ljmp other
    
fj: jb ri,$                  
s1: clr ri                   
    mov a,sbuf                
    mov @r1,a
    inc r1
    dec r2
    ret
 s2:clr ti
    end

  
4楼:sdgaga 2004年7月16日14:10
 结果

我发送12345678,结果收到的是0p |6|? s |&|? p06|?0p |6|?     不知道怎么回事呢?
  
5楼:justrong 2004年7月19日14:12
 你怎么说有问题呢?我刚刚用我的硬件验证了
你怎么说有问题呢?我刚刚用我的硬件验证了这个程序,是没问题的阿?
编译后的程序如下:
flag  equ  10h

beep    equ     p1.2;;;我的硬件板上的蜂鸣器口
feeddog equ     p3.4;;;我的硬件板上的看门狗清零口


                ORG             0000H

                        ajmp            START

                org             0023h
                        ajmp            fj

                org             0080h
START:

        clr     beep

        mov     tmod,#20h  ;串口通讯设置 串口方式1 波特9600 晶振11.0592
                   ;pc方设置:9600/DB8/none/停止位1
        mov     Tl1,#0fDh
        mov     th1,#0fDh
        mov     pcon,#00h
        mov     sp,#60h
        mov     scon,#050h
        clr     et1
        setb    tr1
        setb    ea
        setb    es
other:  mov     r1,#31h
        mov     r2,#08h
        setb    ren

pan:    cpl     feeddog
        cjne    r2,#00h,pan
        mov     r2,#08h
        mov     r1,#31h
fa:     mov     a,@r1
        mov     sbuf,a
        inc     r1
        setb    flag

        cpl     feeddog
        
        jb      flag, $

        cpl     feeddog

        djnz    r2,fa

        ljmp    other

fj:     push    a
        push    psw
        jnb     ri,s2
s1:     clr     ri
        mov     a,sbuf
        mov     @r1,a
        inc     r1
        dec     r2
s2:     jnb     ti,s3
        clr     ti
        clr     flag
s3:     pop     psw
        pop     a
        reti

    end

  
6楼:sdgaga 2004年7月21日09:05
 justrong,拜托了
  
7楼:sdgaga 2004年7月21日09:03
 刚才好像没有传上去阿
调试助手
点击浏览该文件
  
8楼:sdgaga 2004年7月21日08:59
 还是不通阿
我用的是串口调试助手,上传上去,你用用试试呢,看看你这个成功的程序可以和它正常通讯么?。应该不是它的问题吧
  
9楼:justrong 2004年7月21日09:19
 你选择用十六进制方式显示和发送。然后输入
你选择用十六进制方式显示和发送。然后输入8个十六进制数0102030405060708然后点击手动发送即可。注意它下面提示的tx数目好像不正确不过可以不管他。
  
10楼:sdgaga 2004年7月21日09:35
 我试过了
结果是00 40 00 06 40 06 40 00 D8 80 06 40 06 C0
不知道为什么会有14个数
而且和内部ram里的一点也不一样啊
硬件上就是用max232做了电平转换,也没什么
不过昨天我测试了max232的2脚和6脚。只能是8v和-8v,达不到它说明中的10v和-10v,不知道这会不会有用影响。
  
11楼:justrong 2004年7月21日09:38
 那应该是你的晶振电路有问题导致你的上下位
那应该是你的晶振电路有问题导致你的上下位机波特率不一致!
  
12楼:sdgaga 2004年7月21日16:27
 晶振电路不就是这样的么?郁闷~~~~~~~~~~

此主题相关图片如下:
按此在新窗口浏览图片 右边接51的18,19引脚。
我之前都是这么连接的,其他的实验都可以用阿,当然没有做过设定波特率的


  
13楼:justrong 2004年7月21日16:46
 原理图没错不代表电路板没问题啊。
原理图没错不代表电路板没问题啊。
  
14楼:sdgaga 2004年7月21日16:05
 现在能排除的都排除了,估计就是波特率的问题了
但是,用11.0592mhz的晶振,是可以产生几乎没有误差的9600波特率的阿。上位机的波特率我试过用4800的居然偶尔可以成功发一次,当然大部分的还是不成功的。不知道该怎么解决了~
  
15楼:justrong 2004年7月21日16:31
 是的,程序在我的板子上正确就说明程序没问
是的,程序在我的板子上正确就说明程序没问题。我也是11.0592。你再看看电容?或测一下你的xtal2脚的频率是否为11.0592M?
要不再贴出你的硬件图来看看?
  
16楼:sdgaga 2004年7月23日09:05
 justrong,我发现的奇怪问题
我昨天弄了个示波器,用pc机和51分别用2400的波特率发送55h,发现51的码款是pc机的码款的两倍左右。怎么会这样?说明两方的速率根本是不同的。可是波特率的设置没有问题啊。
  
17楼:justrong 2004年7月23日13:28
 我想应该从硬件着手吧,比如用的具体51型
我想应该从硬件着手吧,比如用的具体51型号、晶振产生的最终频率、MAX232的正确使用问题以及电路板有无虚焊假焊错误连线等等。也可以分别按照外频为11.0592M编一段1分钟程序延时程序和用作波特率的那个定时器的定时程序以验证内部时钟是否正确。反正胡乱试试吧:)
  
18楼:sdgaga 2004年7月23日13:37
 阿?
胡乱试试,?唉!!
我是用面包板搭的~
  
19楼:justrong 2004年7月23日13:50
 咳...所谓胡乱试试就是多用一些方法试啊
咳...所谓胡乱试试就是多用一些方法试啊,比如象刚才我说的那些方法。
面包板搭的可靠吗?再检查一下吧!问题肯定是要在硬件上找的,根据你说的很明显是内部时钟不对了!至于原因嘛自己找啊!一部分一部分一段一段的排除。或者再搭出相同的一个电路让他们互连再看结果。另外搭的电路可不要忘记EA脚及RST脚,晶振引线不要太长等。
  
20楼:sdgaga 2004年7月23日14:02
 ea脚?ea脚要怎样?rst脚我已经弄复位电路了

>>>>>>对该主题发表你的看法

本主题贴数26,分页: [第1页] [第2页]


[上一篇主题]:有意者前来探讨

[下一篇主题]:大家帮忙看看这个数据记录仪方案可行吗?