搜索
bottom↓
回复: 17

谁能帮看下我这个RS232收发字符串的程序问题在哪??

[复制链接]

出0入0汤圆

发表于 2010-8-18 21:43:56 | 显示全部楼层 |阅读模式
我把下面的程序放在主程序里怎么没反映呢,串口精灵没有输出字符啊!!!!
我用PIC18F248

loop       movf count1,0 ;count1作为查表地址偏移量送入W
           read1 ;字符串"my name"
           addwf PCL,1 ;地址偏移量加当前PC值
           retlw a'\n' ;换行控制符号,即0DH=<CR>
           retlw a'\r' ;回车控制符号,即0AH=<LF>
           retlw a'M' ;送回到微机超级终端的字符串
           retlw a'y'
           retlw a' '
           retlw a'n'
           retlw a'a'
           retlw a'm'
           retlw a'e'   
           retlw a'\n'
           retlw a'\r' ;
           retlw 0
           movwf temp ;
GetData    btfss PIR1,TXIF ;等待,直到USART空闲
           goto GetData
           movwf TXREG ;查表值送USART
           incf count1,1 ;查表计数器加1
           movf temp,W ;检查到读表值为"0"了吗
           btfss STATUS,Z ;是!跳一步,结束查表
           goto loop ;否!应该返回继续查表

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

 楼主| 发表于 2010-8-18 21:45:55 | 显示全部楼层
要不那位大侠给段串口收发字符串的程序吧!!谢啦,汇编的!!!!!!!!!!

"读串口buffer的值"-----具体怎么实现,能给段源代码吗???谢谢!!!

出0入0汤圆

发表于 2010-8-20 09:26:02 | 显示全部楼层
retlw 是带参数返回指令,你这里loop只能call,不可用goto
  movwf TXREG ;查表值送USART -- 这句应放在call  loop  之后

串口初始化: 之前要将RX引脚设为输入
;******************************************************************
;                init232 - 初始化串行口(init serial port)
;******************************************************************
init232                clrf                STATUS
                bsf                STATUS,RP0                ; BANK1
                movlw                b'00100100'
                movwf                TXSTA                        ; 选择异步高速 传输8位数据方式 发送允许
                movlw                .25
                movwf                SPBRG                        ; 将传输的波特率设为约9600bps(4M)

                clrf                STATUS                        ; BANK0

                movlw                b'10010000'                ; 选择异步高速 传输8位数据方式 接收允许
                movwf                RCSTA                        ; 自动将RC6、RC7配置为串口工作方式(TRISC,7初始化应设为输入)

                return

;******************************************************************

出0入0汤圆

 楼主| 发表于 2010-8-20 17:29:54 | 显示全部楼层
还是不行啊!!!我的串口都设置对了呀!!能直接给段收发字符串的程序吗????????万谢!!!!!!!!!!!

出0入0汤圆

发表于 2010-8-21 10:20:11 | 显示全部楼层
哎!错误在上面已跟你说了,可以在MPLAB SIM里仿真一下啊!    能直接给段收发字符串的程序吗?(人家给的不如自已解决了印象深刻哦)
帮你改下吧 -- :::  从GetData 处运行哎
loop       movf    count1,0  ;count1作为查表地址偏移量送入W
        ;  read1             ;字符串"my name" ?????
           addwf   PCL,1     ;地址偏移量加当前PC值
           retlw   a'\n'     ;换行控制符号,即0DH=<CR>
           retlw   a'\r'     ;回车控制符号,即0AH=<LF>
           retlw   a'M'      ;送回到微机超级终端的字符串
           retlw   a'y'
           retlw   a' '
           retlw   a'n'
           retlw   a'a'
           retlw   a'm'
           retlw   a'e'   
           retlw   a'\n'
           retlw   a'\r'
           retlw   0

GetData    btfss   PIR1,TXIF  ;等待,直到USART空闲
           goto    GetData
           call    loop       ;查表
           movwf   temp       ;
           movwf   TXREG      ;查表值送USART
           incf    count1,1   ;查表计数器加1
           movf    temp,W
           btfss   STATUS,Z   ;检查到读表值为"0"了吗
           goto    GetData    ;继续发送
           goto    $          ;是!结束查表,转到其它处理(这里在此死循环)

出0入0汤圆

 楼主| 发表于 2010-8-22 17:51:57 | 显示全部楼层
大侠,试了您改的程序,怎么只能执行一次呢,应该是反复发送呀??而且每个字符为什么发的是双字符呢?下面是我实际写进PIC的程序

出0入0汤圆

 楼主| 发表于 2010-8-22 17:52:47 | 显示全部楼层
LIST        P=18f248
           INCLUDE     "P18f248.INC"

            org         0x0000                  ;复位矢量
            goto        main                 ;跳转到初始化程序
            org         0x0040                  ;中断矢量

count1      equ      0x72           ;定义一个查表1显示计数器
temp        equ      0x73           ;定义一个临时寄存器
RP0         equ      5h

loop       movf    count1,0  ;count1作为查表地址偏移量送入W  
        ;  read1             ;字符串"my name" ?????
           addwf   PCL,1     ;地址偏移量加当前PC值  
           bsf     PORTB,7
           retlw   a'\n'     ;换行控制符号,即0DH=<CR>  
           retlw   a'\r'     ;回车控制符号,即0AH=<LF>  
           retlw   a'M'      ;送回到微机超级终端的字符串  
           retlw   a'y'  
           retlw   a' '  
           retlw   a'n'  
           retlw   a'a'  
           retlw   a'm'  
           retlw   a'e'     
           retlw   a'\n'  
           retlw   a'\r'
           retlw   0

GetData    btfss   PIR1,TXIF  ;等待,直到USART空闲  
           goto    GetData
           call    loop       ;查表
           movwf   temp       ;  
           movwf   TXREG      ;查表值送USART  
           incf    count1,1   ;查表计数器加1
           movf    temp,W
           btfss   STATUS,Z   ;检查到读表值为"0"了吗  
           goto    GetData    ;继续发送
           return
           ;goto    $          ;是!结束查表,转到其它处理(这里在此死循环)

init232    clrf STATUS
           bsf STATUS,RP0 ; BANK1
           movlw b'00100100'
           movwf TXSTA ; 选择异步高速 传输8位数据方式 发送允许
           movlw .25
           movwf SPBRG ; 将传输的波特率设为约9600bps(4M)
           clrf STATUS ; BANK0
           movlw b'10010000' ; 选择异步高速 传输8位数据方式 接收允许
           movwf RCSTA ; 自动将RC6、RC7配置为串口工作方式(TRISC,7初始化应设为输入)
           bcf         TRISB,7                ;设置RC0输出,以驱动LED闪烁做运行指示灯
           bcf         TRISB,5
           return

main      
           call init232
           call GetData
           bsf  PORTB,5
           end

出0入0汤圆

 楼主| 发表于 2010-8-22 17:57:54 | 显示全部楼层
现在发现了一些问题,
1.PC机必须重启才能再次收到字符串(是双字符).
2.我再PORTB 7上接了个LED灯,
                           addwf   PCL,1     ;地址偏移量加当前PC值   
                           bsf     PORTB,7
  但是再次执行程序后灯不亮,应该是走到这步死机了,不知为何??
谢谢!!!!!!!!!

出0入0汤圆

 楼主| 发表于 2010-8-22 18:14:40 | 显示全部楼层
现在急死了,以前没搞过232通讯,下星期临时要用,领导一直催,要是有时间也不至于整天问呀!!谢谢youmcu帮忙!!

出0入0汤圆

发表于 2010-8-23 03:52:25 | 显示全部楼层
"现在急死了"

wow. I thought only a girly man would get killed by a simple program

here is software-uart, in C.

======uart-sw==================

void usart_putch(unsigned char ch)
{
        unsigned char bitcount=1+8+1;                        //start bit, 8 data bits, 1 stop bit
        //each
        //RB4=0;
        IO_CLR(USART_PORT, USART_Tx);                //drive tx pin low - usart start condition
        do {
                usart_delay_tx_bit();                                //delay some time
                if (ch & 0x01) IO_SET(USART_PORT, USART_Tx);        //send a 1
                else IO_CLR(USART_PORT, USART_Tx);                //otherwise, send a 0
                ch=(ch>>1) | 0x80;                                //shift out the next bit
        } while (--bitcount);
        //NOP();
}
===========end=============


hardware uart is even simpler:

====uart-hw===========

void usart_putch(unsigned char ch)
{
        //Wait for TXREG Buffer to become available
        //while(!TXIF);                        //wait for prior transmission to finish
        USART_WAIT(TXIF);

        //Write data
        TXREG=ch;                                //load up the tx register

        //while(!TRMT);                        //wait for the transmission to finish
                                                        //don't use txif as this is not back-to-back transmission
}
============end================

出0入0汤圆

发表于 2010-8-23 12:54:14 | 显示全部楼层
loop       movf    count1,0  ;count1作为查表地址偏移量送入W   
        ;  read1             ;字符串"my name" ?????  
           addwf   PCL,1     ;地址偏移量加当前PC值   
           bsf     PORTB,7   ;!!!!!不可在PCL运算中,count1=0时要错误的,
           retlw   a'\n'     ;换行控制符号,即0DH=<CR>
           .

init232    .....
           bcf         TRISB,7                ;!!!!如设为输出,则不能用于RX接收
           bcf         TRISB,5
           return

main        
           call   init232
main2      call   GetData
           bsf    PORTB,7   ;?? 如果需要
           bsf    PORTB,5   ;??

           clrf   count1    ;PCL运算从0开始
           goto   main2

           end

出0入0汤圆

发表于 2010-8-23 13:40:00 | 显示全部楼层
呵......看错了!以为是 (TRISC,7)了  ;!!!!如设为输出,则不能用于RX接收

init232    .....
           bsf         STATUS,RP0       ; BANK1  TRISB在第1页
           bcf         TRISB,7                ;设置RC0输出,以驱动LED闪烁做运行指示灯
           bcf         TRISB,5
           return

出0入0汤圆

发表于 2010-8-23 23:08:03 | 显示全部楼层
;*****************************************
;***Name:R485_tran_xx*********************
;***Function:发送一字节数据***************
;***IN:RS485_tran_temp********************
;***OUT:无********************************
;***USE:TXREG、RS485_tran_temp************
;*****************************************
R485_tran_xx
                BSF        RS485_EN
                MOVFF      RS485_tran_temp,TXREG1
TXW5            BTFSS      TXSTA1,TRMT
                GOTO       TXW5
               
                BSF        RS485_TX
                BCF        RS485_EN

                RETURN

出0入0汤圆

发表于 2010-8-23 23:09:01 | 显示全部楼层
看看 我做的 RS485的通信程序   使用的是PIC18F85J10 通信没问题

出0入0汤圆

 楼主| 发表于 2010-8-25 17:52:58 | 显示全部楼层
问题解决一半了,能发字符串,但是收还是不行,下面是程序,各位大侠帮看下问题在哪???

出0入0汤圆

 楼主| 发表于 2010-8-25 17:54:16 | 显示全部楼层
LIST        P=18f248
           INCLUDE     "P18f248.INC"

            org         0x0000                  ;复位矢量
            goto        main                 ;跳转到初始化程序
            org         0x0040                  ;中断矢量

count1      equ      0x72           ;定义一个查表1显示计数器
temp        equ      0x73           ;定义一个临时寄存器
RP0         equ      5h
DATA1       equ      0x74
TEMP        equ      0x75
rc          equ      0x76

loop       movf    count1,0  ;count1作为查表地址偏移量送入W  
           addwf   PCL,1     ;地址偏移量加当前PC值  
           retlw   a'\n'     ;换行控制符号,即0DH=<CR>  
           retlw   a'\r'     ;回车控制符号,即0AH=<LF>  
           retlw   a'M'      ;送回到微机超级终端的字符串  
           retlw   a'y'  
           retlw   a' '  
           retlw   a'n'  
           retlw   a'a'  
           retlw   a'm'  
           retlw   a'e'     
           retlw   a' '  
           retlw   a'i'  
           retlw   a's'  
           retlw   a' '  
           retlw   a'p'  
           retlw   a'i'     
           retlw   a'c'  
           retlw   a'1'  
           retlw   a'8'  
           retlw   a'f'  
           retlw   a'2'  
           retlw   a'4'  
           retlw   a'8'     
           retlw   a'.'  
           retlw   a'\n'  
           retlw   a'\r'
           retlw   0
           clrf   count1

read2       movf        rc,0                                  ;字符串"What is your name?"
            addwf       PCL,1
            retlw       a'W'
            retlw       a'h'
            retlw       a'a'
            retlw       a't'
            retlw       a' '
            retlw       a'i'
            retlw       a's'
            retlw       a' '
            retlw       a'y'
            retlw       a'o'
            retlw       a'u'
            retlw       a'r'
            retlw       a' '
            retlw       a'n'
            retlw       a'a'
            retlw       a'm'
            retlw       a'e'
            retlw       a'?'
            retlw       0
            clrf        rc           

GetData    btfss   PIR1,TXIF  ;等待,直到USART空闲  
           goto    GetData
           call    loop       ;查表
           movwf   temp       ;  
           movwf   TXREG      ;查表值送USART  
           incf    count1,1   ;查表计数器加1
           incf    count1,1
           movf    temp,0
           btfss   STATUS,Z   ;检查到读表值为"0"了吗  
           goto    GetData    ;继续发送
           return
           ;goto    $          ;是!结束查表,转到其它处理(这里在此死循环)

fb          movf        RCREG,0
            sublw       0x0d
            btfss       STATUS,Z
            goto        fb
            movf        RCREG,0                 ;重新从USART接收数据到W
            movwf       TXREG                   ;并且转送回去
            movf        rc,0              ;清0读表索引值寄存器
            call        read2             ;调用读表子程序
            incf        rc,1              ;读表索引值递增
            incf        rc,1
            subwf       RCREG,0                 ;输入信息与合法信息比较
            btfsc       STATUS,Z                 ;看是否相符?
            call        loop
            goto        fb
            bsf         PORTB,7
            clrf        rc
            return

init232    clrf STATUS
           bsf STATUS,RP0 ; BANK1
           movlw b'00100100'
           movwf TXSTA ; 选择异步高速 传输8位数据方式 发送允许
           movlw .25
           movwf SPBRG ; 将传输的波特率设为约9600bps(4M)
           clrf STATUS ; BANK0
           movlw b'10010000' ; 选择异步高速 传输8位数据方式 接收允许
           movwf RCSTA ; 自动将RC6、RC7配置为串口工作方式(TRISC,7初始化应设为输入)
           bcf         TRISB,7                 
           return

main      
           call init232
m2         call fb
           clrf count1
           clrf rc
           goto m2
           ;bsf  PORTB,7
           end

出0入0汤圆

 楼主| 发表于 2010-9-1 17:40:30 | 显示全部楼层
还是没找到问题在哪,好几天了,还是没人看??谢谢大家帮忙了!!!!!!!!!!

出0入0汤圆

发表于 2010-9-28 17:29:11 | 显示全部楼层
那要是用C写的话我可以帮助你,我有现成的程序,按你的要求可以帮你改!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-20 09:56

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表