佳礼资讯网

 找回密码
 注册

ADVERTISEMENT

楼主: pikachew

请问RS232能显示BREADBOARD上的资料吗?

  [复制链接]
 楼主| 发表于 31-10-2011 09:28 PM | 显示全部楼层
从楼主的发问, 感觉楼主对USART 没有基本概念。。
好好看:
电脑串行端口(serial port) 和单晶片通讯
pic 发表于 31-10-2011 04:46 PM


可是
PIC16F877A
我不能INCLUDE<USART.H>
所以写的方式就不能更PIC18的方式一样了?对不?
谢谢。
回复

使用道具 举报


ADVERTISEMENT

发表于 31-10-2011 10:58 PM | 显示全部楼层
可是
PIC16F877A
我不能INCLUDE
所以写的方式就不能更PIC18的方式一样了?对不?
谢谢。
pikachew 发表于 31-10-2011 09:28 PM

你如果是用CCS C, 就用CCS C 的方式写。
你如果是用HiTech  C, 就用HiTech  C 的方式写。

不同的compiler 有不同的写法。

现在, 你的问题是在PIC MCU 的编程, 还是PC 那方面?
不要把拆问题来问, 再看看版规, 如果你是新的问题
你要人家帮你, 你要先让人家知道, 清楚你的问题。。。
回复

使用道具 举报

 楼主| 发表于 1-11-2011 12:49 AM | 显示全部楼层
你如果是用CCS C, 就用CCS C 的方式写。
你如果是用HiTech  C, 就用HiTech  C 的方式写。

不同的co ...
pic 发表于 31-10-2011 10:58 PM



    我要的是CCS C方式
资料是从电脑VB SEND 过来的
PIC16F877A里面的
我从头到尾的问题都是关于这个PROJECT的
所以我都发在同一个贴里。
刚刚试了这,这是用CCS来写的CODE
  1. char rec;
  2. if (rec=="A")
  3. {
  4. printf("I got it");
  5. delay_ms(2000);
  6. }
复制代码

还是不行。我在VB里写了
  1. SERIALPORT1.WRITE“A"
复制代码

难到用CCS写的CODE错了?
谢谢。
回复

使用道具 举报

发表于 1-11-2011 07:34 AM | 显示全部楼层
本帖最后由 pic 于 1-11-2011 08:18 AM 编辑
我要的是CCS C方式
资料是从电脑VB SEND 过来的
PIC16F877A里面的
我从头到尾的问题都是关于这 ...
pikachew 发表于 1-11-2011 12:49 AM

首先, 你要学会除错(debug)的技巧。
当一个电路不操作时, 你要知道问题在那里。
可以一次只是做一件事, 先看看电路是否能TX, 然后看看是能否能RX。
先检查是否能TX 很容易,比如在你的程序里不断的发送一些字串就可以了。

你也要先确认, 你的电路是对的, 你要有电平转换电路, 如MAX232 或 类似的。
最好, 你可以放你硬体的照片,你的电脑, 你的电线,  看看你是怎样弄的。。

然后, 先使用Hyperterminal, 测试 以下的sample code。
你应该要能够收, 能够发。
你一上电后, 你要在Hyperterminal 上看到字串 “This is a demo“
你如果可以看到”This is a demo“, 表示你的MCU 发送的部分是操作的, 如果你看不到, 请反复检查, 直到你得到预订的效果为止。

成功后, 你再用VB 发送
  1. SERIALPORT1.WRITE“1"
复制代码

然后看看下面的电路, 接在Port B0 的LED 是否会亮灯, 灭灯。
然后你在报告成绩吧。。

  1. // Demo how to receive one chr from RS232
  2. // by : pic@cArI ( 1 Nov 2011 )
  3. #include "16f877A.h"
  4. #fuses HS,NoPROTECT,NoWDT,put,brownout
  5. #use delay(clock=4000000)
  6. #use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7,ERRORS)


  7. char chr;
  8. void main()
  9. {

  10.    printf("\n\rThis is a demo");
  11.    
  12.    while(1)
  13.    {
  14.       if(kbhit())  // check if there is a char ready to fetch
  15.       {              
  16.          chr=getc(); // get one char from USART  
  17.          putc(chr); // here we echo the chr we received            

  18.          switch(chr)  // here we check what chr we fetch
  19.          {
  20.             case '1':  // we get a '1', turn on LED
  21.                   printf("\n\rThis is 1-On LED");
  22.                   output_High(pin_b0);                     
  23.                break;

  24.             case '2': // we get a '2', turn off LED
  25.                   printf("\n\rThis is 2-Off LED");
  26.                   output_low(pin_b0);                     
  27.                break;
  28.          }
  29.       }
  30.    }
  31. }
复制代码
回复

使用道具 举报

 楼主| 发表于 1-11-2011 08:08 AM | 显示全部楼层
  1.     #include "16f877a.h"
  2.     #fuses XT,PROTECT,NoWDT,put,brownout
  3.     #use delay(clock=4000000)
  4.     #use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7,ERRORS)
  5. #include "lcd.c"

  6.     int1 fiA0=0; // Flag
  7.     int1 fiA1=0;
  8.         int1 fiA2=0;
  9. char rec;


  10.                
  11.     void main()
  12.     {
  13.       lcd_init();       
  14.       lcd_putc("\fCar Park Sys");
  15.      
  16.       delay_ms(2000);
  17.       lcd_putc("\f"); // clear LCD screen
  18.                
  19.       fiA0=input(pin_a0); // initialize
  20.       fiA1=input(pin_a1); // initialize
  21.           fiA2=input(pin_a2); // initialize
  22.                
  23.        while(1)
  24.        {
  25.                
  26.           if(fiA0!=input(pin_a0)) // Test if Flag is change status
  27.           {
  28.              fiA0=input(pin_a0); // lock Flag
  29.           delay_ms(100); // debounce
  30.              if(input(pin_a0)==1)
  31.              {
  32.                                 rec=getch();
  33.                 output_low(pin_d7);
  34.                 printf("\nPARKING LOT 1- OCCUPIED\r");
  35.                                 lcd_putc("\fPL1-occupied");
  36.                                 if (rec=="A")
  37.                                         {
  38.                                                 printf("I got it");
  39.                                                 delay_ms(1000);
  40.                                                         }                       
  41.                       
  42.              }
  43.              else
  44.              {
  45.                 output_high(pin_d7);
  46.                 printf("\nPARKING LOT1- EMPTY\r");
  47.          
  48.             lcd_putc("\fPL1-empty");

  49.              }
  50.                        
  51.           }      
  52.          
  53.           if(fiA1!=input(pin_a1)) // Test Flag
  54.           {
  55.              fiA1=input(pin_a1); // lock Flag
  56.             delay_ms(100); // debounce
  57.              if(input(pin_a1)==1)
  58.              {
  59.                 output_low(pin_d6);
  60.                 printf("\nPARKING LOT2-OCCUPIED\r");

  61.             lcd_putc("\fPL2-occupied");
  62.                        

  63.                

  64.              }
  65.              else
  66.              {
  67.                 output_high(pin_d6);
  68.                 printf("\nPARKING LOT2-EMPTY\r");
  69.    
  70.             lcd_putc("\fPL2-empty");


  71.                 }
  72.           }


  73.                     if(fiA2!=input(pin_a2)) // Test Flag
  74.           {
  75.              fiA2=input(pin_a2); // lock Flag
  76.             delay_ms(100); // debounce
  77.              if(input(pin_a2)==1)
  78.              {
  79.                 output_low(pin_d5);
  80.                 printf("\nPARKING LOT3-OCCUPIED\r");

  81.             lcd_putc("\fPL3-occupied");

  82.                

  83.              }
  84.              else
  85.              {
  86.                 output_high(pin_d5);
  87.                 printf("\nPARKING LOT3-EMPTY\r");
  88.    
  89.             lcd_putc("\fPL3-empty");


  90.                 }
  91.           }

  92.        
  93.                 if((input(pin_a0)==1) && (input(pin_a1)==1) && (input(pin_a2)==1))
  94.                         {
  95.                                 delay_ms(1000);
  96.                                 lcd_putc("\fPL available:0");
  97.                                 delay_ms(1000);
  98.                                 printf("\nPL available:0");
  99.                                 break;
  100.                                                 }
  101.                                
  102.                 else if((input(pin_a0)==0) && (input(pin_a1)==0) && (input(pin_a2)==0))
  103.                                 {
  104.                                 delay_ms(1000);
  105.                                 lcd_putc("\fPL available:3");
  106.                                 delay_ms(2000);
  107.                                 lcd_putc("\fPL1-empty");
  108.                                 lcd_putc("\nPL2-empty");
  109.                                 delay_ms(1000);
  110.                                 lcd_putc("\fPL3-empty");
  111.                                 delay_ms(1000);
  112.                        
  113.                                                 }

  114.                                 else if((input(pin_a0)==0) && (input(pin_a1)==0) && (input(pin_a2)==1))
  115.                 {
  116.                                 delay_ms(1000);
  117.                                 lcd_putc("\fPL available:2/3");
  118.                                 delay_ms(1000);
  119.                                 lcd_putc("\fPL1:empty");
  120.                                 lcd_putc("\nPL2:empty");
  121.                                
  122.                                
  123.                                         }       
  124.                
  125.                         else if((input(pin_a0)==0) && (input(pin_a1)==1) && (input(pin_a2)==0))
  126.                 {
  127.                                 delay_ms(1000);
  128.                                 lcd_putc("\fPL available:2/3");
  129.                                 delay_ms(1000);
  130.                                
  131.                                 lcd_putc("\fPL2:empty");
  132.                                 lcd_putc("\nPL3:empty");
  133.                                
  134.                                         }       
  135.                        
  136.                                 else if((input(pin_a0)==0) && (input(pin_a1)==1) && (input(pin_a2)==1))
  137.                 {
  138.                                 delay_ms(1000);
  139.                                 lcd_putc("\fPL available:1/3");
  140.                
  141.                                 lcd_putc("\nPL1:empty");
  142.                        
  143.                                         }       
  144.                        
  145.                                 else if((input(pin_a0)==1) && (input(pin_a1)==0) && (input(pin_a2)==0))
  146.                 {
  147.                                 delay_ms(1000);
  148.                                 lcd_putc("\fPL available:2/3");
  149.                         delay_ms(1000);
  150.                         lcd_putc("\fPL2:empty");
  151.                
  152.                         lcd_putc("\nPL3:empty");
  153.                                
  154.                                 }       


  155.                                 else if((input(pin_a0)==1) && (input(pin_a1)==0) && (input(pin_a2)==1))
  156.                 {
  157.                         delay_ms(1000);
  158.                                 lcd_putc("\fPL available:1/3");
  159.                        
  160.                                 lcd_putc("\nPL2:empty");
  161.                        
  162.                                         }       


  163.                                 else if((input(pin_a0)==1) && (input(pin_a1)==1) && (input(pin_a2)==0))
  164.                 {
  165.                                
  166.                                 delay_ms(1000);
  167.                                 lcd_putc("\fPL available:1/3");
  168.                        
  169.                                 lcd_putc("\nPL3:empty");
  170.                        
  171.                                         }       
  172.                
  173.         }       

  174. }

复制代码
放你完整的ccs c code。
pic 发表于 1-11-2011 07:34 AM

比如说当VBSEND了"A"过来,然后这里就会printf(“I GOT A”)
谢谢。这是完整的CODE.
回复

使用道具 举报

发表于 1-11-2011 08:19 AM | 显示全部楼层
比如说当VBSEND了"A"过来,然后这里就会printf(“I GOT A”)
谢谢。这是完整的CODE.
pikachew 发表于 1-11-2011 08:08 AM

请看124楼
回复

使用道具 举报

Follow Us
发表于 1-11-2011 08:42 AM | 显示全部楼层
比如说当VBSEND了"A"过来,然后这里就会printf(“I GOT A”)
谢谢。这是完整的CODE.
pikachew 发表于 1-11-2011 08:08 AM

你不要用VB 来测试, 先用Hyperterminal, 成功了你才用VB。。
但是, 问题是你会在什么时候送出‘A’?
我不知道你这样做的目的是什么, 但是如果你硬要的话, 你改成下面的code

if(input(pin_a0)==1)
{
   if(kbhit)  // 加入这个,如果没有这个, 你的MCU 会一直等PC 送data来
   {
      rec=getch();   
   }
   output_low(pin_d7);
   printf("\nPARKING LOT 1- OCCUPIED\r");
   lcd_putc("\fPL1-occupied");
   if (rec=="A")
   {
      rec=0;  // 你需要reset, 不然会一直重复 ”I got it“
      printf("I got it");
      delay_ms(1000);
   }                       
}
回复

使用道具 举报

 楼主| 发表于 1-11-2011 07:07 PM | 显示全部楼层
首先, 你要学会除错(debug)的技巧。
当一个电路不操作时, 你要知道问题在那里。
可以一次只是做一件 ...
pic 发表于 1-11-2011 07:34 AM


刚刚试了这CODE
电脑完全没有TRANSMIT到data 去PIC
用了,HYPERTERMINAL, REAL TERM,VB2010
试了
都不能。
不知道是什么问题。
谢谢。
[img][/img]
我的max232IC 是跟这里的
回复

使用道具 举报


ADVERTISEMENT

发表于 1-11-2011 07:40 PM | 显示全部楼层
回复 128# pikachew


    如果你的DB9 cable pin2,pin3 不是交叉的话,就出错了。
回复

使用道具 举报

 楼主| 发表于 1-11-2011 08:04 PM | 显示全部楼层
回复  pikachew


    如果你的DB9 cable pin2,pin3 不是交叉的话,就出错了。
wkloh 发表于 1-11-2011 07:40 PM



    就是说db9的PIN 2 和PIN3要交差?
谢谢。交差的意思是指CROSS?
回复

使用道具 举报

发表于 1-11-2011 10:53 PM | 显示全部楼层
回复 130# pikachew


    没错,一端DB9 pin2,pin3 cross。
回复

使用道具 举报

 楼主| 发表于 1-11-2011 11:05 PM | 显示全部楼层
回复  pikachew


    没错,一端DB9 pin2,pin3 cross。
wkloh 发表于 1-11-2011 10:53 PM


[img][/img]
青色---PIN5
蓝色----PIN3
黄色----PIN2
[img][/img]
    变成这样?
可是这样会有帮助的?
谢谢
回复

使用道具 举报

发表于 1-11-2011 11:50 PM | 显示全部楼层
[/URL][/img]
青色---PIN5
蓝色----PIN3
黄色----PIN2
[/URL][/img]
    变成这样?
可是这样 ...
pikachew 发表于 1-11-2011 11:05 PM


改接成:

青色---PIN5
蓝色----PIN2
黄色----PIN3
回复

使用道具 举报

 楼主| 发表于 2-11-2011 06:24 PM | 显示全部楼层
首先, 你要学会除错(debug)的技巧。
当一个电路不操作时, 你要知道问题在那里。
可以一次只是做一件 ...
pic 发表于 1-11-2011 07:34 AM


我试了这按“1”和“2”了
也完全没RESPOND.
于是,我就换了我自己的来试但也是不能。
  1.     // Demo how to receive one chr from RS232
  2.     // by : pic@cArI ( 1 Nov 2011 )
  3.     #include "16f877A.h"
  4.     #fuses HS,NoPROTECT,NoWDT,put,brownout
  5.     #use delay(clock=4000000)
  6.     #use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7,ERRORS)
  7.     char chr;
  8.     void main()
  9.     {
  10.        
  11.        printf("\n\rThis is a demo");
  12.       
  13.        while(1)
  14.        {

  15.                                 output_high(pin_d5);
  16.                        
  17.          if(kbhit())  // check if there is a char ready to fetch
  18.           {              
  19.              chr=getc(); // get one char from UART  
  20.              putc(chr); // here we echo the chr we received            
  21.                        
  22.              if (chr='q')
  23.                         {
  24.                                 delay_ms(1000);
  25.                                 printf("I got it");
  26.                                 delay_ms(1000);
  27.                                 output_high(pin_d5);
  28.                                 output_high(pin_d6);
  29.                                 output_high(pin_d7);
  30.                                 break;
  31.                                                                 }



  32.                 }
  33.                
  34.        }
  35.     }
复制代码

    难道FUSED: HS 需要换成XT??
WKLOH兄说所的交差,
我也试了也是不能。
交差了printf也显示不到
谢谢。
回复

使用道具 举报

发表于 2-11-2011 07:46 PM | 显示全部楼层
本帖最后由 pic 于 2-11-2011 07:47 PM 编辑
我试了这按“1”和“2”了
也完全没RESPOND.
于是,我就换了我自己的来试但也是不能。

    难道FU ...
pikachew 发表于 2-11-2011 06:24 PM

Fuse 要放XT , 如果是4Mhz
Fuse 要放HS , 如果是》4Mhz
我的code 模拟时是用20Mhz, 后来我看你是用4Mhz, 改去4Mhz后忘了改Fuse XT, 对不起。




  1. #include "16f877A.h"
  2. #fuses XT,NoPROTECT,NoWDT,put,brownout
  3. #use delay(clock=4000000)
  4. #use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7,ERRORS)
  5.    
  6. void main()
  7. {
  8.    while(1)
  9.   {
  10.       output_high(pin_b0);
  11.       putc('A');
  12.      delay_ms(500);   
  13.      output_low(pin_b0);
  14.       putc('B');
  15.      delay_ms(500);   
  16.    }
  17. }
复制代码

   
你先运行上面的code 吧
用hyperterminal
你一定要在hyperterminal 看到ABABABABABABABABABABABABABABABABAB
然后接在port B0 的LED要按1Hz的速度闪。

看到了, 回来报告, 再告诉你下一步。

看不到, 请检查你的硬体,你的接线, 你的MAX232, 你的MCU, 直到你拿到上面的效果为止。
如果还是不可以, 请放你的硬体的图, 完整的,看到整个的, 还有特写的, 很想看你是怎样接的。
回复

使用道具 举报

 楼主| 发表于 2-11-2011 11:25 PM | 显示全部楼层
Fuse 要放XT , 如果是4Mhz
Fuse 要放HS , 如果是》4Mhz
我的code 模拟时是用20Mhz, 后来我看你是用4 ...
pic 发表于 2-11-2011 07:46 PM

试了
这CODE完全没问题。

如果PUTC,PRINTF都可以走,但是为什么getc不能呢?
试了用了另外一个DB9 FEMAL PIN 和 RS232 USB TO SERIAL COVERTER
所以断定这两样东西没问题。
回复

使用道具 举报


ADVERTISEMENT

发表于 2-11-2011 11:59 PM | 显示全部楼层
试了
这CODE完全没问题。

如果PUTC,PRINTF都可以走,但是为什么getc不能呢?
试了用了另外一个DB9 ...
pikachew 发表于 2-11-2011 11:25 PM


现在试下面的code, 一样的, 还是用hyperterminal
和之前的code 一样, 你会看到LED 闪, 还有ABABABABABABABABABABABABABABAB
但是, 你可以试试在hyperterminal 打字。
你打“1”,要显示“2”
你打“2”,要显示“3”
你打“D”,要显示“E”
你打“c”,要显示“d”
总之是会显示下一个之母就是了。
然后回来报告。


  1. #include "16f877A.h"
  2. #fuses XT,NoPROTECT,NoWDT,put,brownout
  3. #use delay(clock=4000000)
  4. #use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7,ERRORS)
  5. int chr;     
  6. void main()
  7. {
  8.    while(1)
  9.   {
  10.      if(kbhit())
  11.      {
  12.         chr=getc();
  13.         putc(chr+1);
  14.      }
  15.      else
  16.     {
  17.        output_high(pin_b0);
  18.        putc('A');
  19.       delay_ms(500);   
  20.       output_low(pin_b0);
  21.        putc('B');
  22.       delay_ms(500);   
  23.      }
  24.    }
  25. }

复制代码
回复

使用道具 举报

 楼主| 发表于 3-11-2011 07:30 PM | 显示全部楼层
现在试下面的code, 一样的, 还是用hyperterminal
和之前的code 一样, 你会看到LED 闪, 还有ABABAB ...
pic 发表于 2-11-2011 11:59 PM


我试了(不是这CODE),SIMULATION可以跑到,但是用我的电脑跑和CIRCUIT走不到。我是用WIN XP的。
刚刚试了,同样的CIRCUIT和同样的CODING在朋友的电脑却可以跑到。他的是WIN7

难道不同VERSION得WINDOWS 也会受影响?

然后大大给我的这CODE,SIMULATION也是可以跑到。REAL CIRCUIT也是跑不到
初步怀疑是电脑WINDOWS的问题。
然后最后一个问题是,难道4MHZ CRYSTAL 就不能用9600的BAUD RATE?
我朋友告诉我如果用4 MHZ CRYSTAL OSCILLATION 就一定要用300 的BAUD RATE.
谢谢。
回复

使用道具 举报

发表于 3-11-2011 11:25 PM | 显示全部楼层
我试了(不是这CODE),SIMULATION可以跑到,但是用我的电脑跑和CIRCUIT走不到。我是用WIN XP的。
刚刚试了,同样的CIRCUIT和同样的CODING在朋友的电脑却可以跑到。他的是WIN7

难道不同VERSION得WINDOWS 也会受影响?
pikachew 发表于 3-11-2011 07:30 PM

Win98, WinME, WinXP, Win Vista,Win7 都可以跑。


然后大大给我的这CODE,SIMULATION也是可以跑到。REAL CIRCUIT也是跑不到
初步怀疑是电脑WINDOWS的问题。

是你的电路, 不是Windows。
请问: 你有用Hyperterminal 吗?
你的电路的照片呢?

然后最后一个问题是,难道4MHZ CRYSTAL 就不能用9600的BAUD RATE?

4Mhz 可以跑到9600bps。


我朋友告诉我如果用4 MHZ CRYSTAL OSCILLATION 就一定要用300 的BAUD RATE.
  
你可以选择相信他。
你也可以学着看Datasheet, 然后告诉他。


仔细的看回Wkloh 的回复, 他已经告诉你怎样检查你的RS232 port 是否良好, 他已经教你怎样loopback了,检查你的USB to RS232 是否良好。。

这是很简单, 很基本的电路。。很基本的code。。你没有按指示Debug, 那很遗憾。
回复

使用道具 举报

 楼主| 发表于 5-11-2011 12:43 AM | 显示全部楼层
Win98, WinME, WinXP, Win Vista,Win7 都可以跑。



是你的电路, 不是Windows。
请问: 你有用Hy ...
pic 发表于 3-11-2011 11:25 PM


我有用HYPER TERMINAL ,REAL TERM 试了才用VB 试的。
PUTC/PRINTF都没问题
LOOP BACK TEST有做过完全没反应。
如果是电路的问题但是不明白的就是为什么用我的电路在我朋友的电脑和他的VB PROGRAM能跑的到呢?可是我的却不能呢?
试了3台电脑,同样VB PROGRAM,同样CIRCUIT。2台WIN7,一台WINXP
最后只有一台WIN7跑的到。。
照片稍后在UPLOAD上来
谢谢。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

 

ADVERTISEMENT



ADVERTISEMENT



ADVERTISEMENT

ADVERTISEMENT


版权所有 © 1996-2023 Cari Internet Sdn Bhd (483575-W)|IPSERVERONE 提供云主机|广告刊登|关于我们|私隐权|免控|投诉|联络|脸书|佳礼资讯网

GMT+8, 28-4-2024 07:23 AM , Processed in 0.067538 second(s), 21 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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