Malay
颜色选择
阳光橙
深夜黑
天空蓝
葡萄紫
薄荷绿
深海蓝
首页
论坛
佳礼报道
新闻
搜索
5710
查看
73
回复

(求助)无线(Miwi)广告版

[复制链接]

楼主: xin777_88       显示全部楼层   阅读模式

楼主
 楼主| 发表于 19-5-2010 05:25 PM | 显示全部楼层
终于都考完试了.........fritlizt, 所以我是不是可以直接把我的UAR的程式写在simpleexamplenode2.c 里面呢?
回复

使用道具 举报

楼主
 楼主| 发表于 19-5-2010 08:04 PM | 显示全部楼层
void sendtx( unsigned char);
void main (void)
{
TXSTA=0X20;
SPBRG=32;
TXSTABITS.TXEN=1;
RCSTABITS.SPEN=1;


        while(1)
{
  if( MiApp_MessageAvailable() )
        {
        sendtx(rxMessage.Payload[0]);

        MiApp_DiscardMessage();
        }
       
}
void sendtx(unsigned char c)
{
        while(PIR1bits.TXIF==0);
        TXREG=c;
}


是不是这样写呢?请问 void sendtx( unsigned char) 应该要写在那里?可以写在simpleexamplenode2.c 吗?
回复

使用道具 举报

发表于 25-5-2010 11:29 PM | 显示全部楼层
回复 42# xin777_88


   
你的sendtx是要拿来干什么用的?把得到的data forward去uart吗?
如果是这样, 万一你通过miwi forward整个string过来(一个packet),这样payload[0]就错了。
可以有更efficient的写法的。

给你一个意见。
我以前,为了方便, 我一个packet只是forward一byte的data.很不efficient.
你可以你个packet send一个string.比较efficient.
library有提供buffer check 的function.你可以通过miwi library确认收到多少byte的data过后,再来决定你要forward多少byte出去uart.

不过前提是,你的uart可以function了吗?先把miwi放在一边 确定你的uart tx可以tx.用电脑确认或者其他方法。不然的话收不到data都不懂是miwi还是uart问题。
回复

使用道具 举报

楼主
 楼主| 发表于 11-6-2010 09:47 AM | 显示全部楼层
经过多次的失败,我终于做到基本uart的function 了。意思是说,我把data送去pic18f4520然后在送回电脑,同时确定了receive的data都是对的。你的意思是不是收到string在check看有多少byte然后才利用uart一个byte一个byte这样送出去呢?我在miwi 的menu看了它的function你所谓library有提供buffer check 的function是不是receivedpacket?你能不能告诉我清楚一点?谢谢。
回复

使用道具 举报

发表于 12-6-2010 02:07 PM | 显示全部楼层
回复 44# xin777_88


   

嗯。。。我用的是protocol 版本是   *  0.1   1/03/2008    yfy       Initial revision

你需要检查看看你的protocol stack是不是和我的一样版本。版本不一样可能会有不一样。
如何接受data:
首先你要确定你收到data了。call这个function -> ReceivedPacket()
接下来,你要知道你的packet size是多少。 比如说人家send "abcde"给你, 你的data size 是5 bytes.
protocol stack已经帮你整理这个部分了。被你只需要读取rxFrame.PayLoadSize这个variable.
接下来, 你知道你的data size多大了。你就继续收data。简单的while, for loop就可以了。看以下的example.
如果版本不一样,方法应该变动不多。


  1. /*******************************************************************/
  2.         // Function ReceivedPacket will return a boolean to indicate if a
  3.         // packet has been received by the transceiver. If a packet has been
  4.         // received, all information will be stored in the rxFrame, structure
  5.         // of RECEIVED_FRAME.
  6.         /*******************************************************************/
  7.         if( ReceivedPacket())
  8.         {
  9.             for(i = 0; i < rxFrame.PayLoadSize; i++)
  10.                 ConsolePut(rxFrame.PayLoad[i]);
  11.            
  12.             // Toggle LED2 to indicate receiving a packet.
  13.             LED_2 ^= 1;   
  14.             DiscardPacket();
  15.         }
复制代码
回复

使用道具 举报

楼主
 楼主| 发表于 15-6-2010 11:02 AM | 显示全部楼层
本帖最后由 xin777_88 于 15-6-2010 11:32 AM 编辑

回复 45# fritlizt
请问一下我要去那里查看我的版本? 可是author 是一样的yfy.还有就是consoleput是不是把data一个一个send出去?如果是的话,我是不是不需要在利用我之前所写的uart coding了?
回复

使用道具 举报

发表于 16-6-2010 08:43 AM | 显示全部楼层
回复 46# xin777_88


   
simpleexample node2.最上面
* Change History:
*  Rev   Date         Author    Description
*  0.1   1/03/2008    yfy       Initial revision
*  2.0   4/15/2009    yfy       MiMAC and MiApp revision
*  1.1   06/20/2009   yfy       Add LCD support

这个是最新的。

consoleput是在console.c里面。本来就有的了。自己去看。
最新的coding有点不一样。不过都很类似。
看看example会知道payload是什么,payload size怎么找。要怎么send/receive data.
你自己先看看,不明白再发问
回复

使用道具 举报

楼主
 楼主| 发表于 16-6-2010 10:05 PM | 显示全部楼层
回复 47# fritlizt
谢谢你的指示。看来我的是新的。如果新的coding是:1) rxFrame.PayloadSize = rxMessage.PayloadSize
2) receivedPacket = MiApp_MessageAvailable
3) DiscardPacket = MiApp_DiscardMessage

那我的coding是不是如下:
if(MiApp_MessageAvailable())
{
for(i = 0; i < rxMessage.PayloadSize; i++)
consolePut(rxMessage.Payload);


LED_2^=1;
MiApp_DiscardMessage();
}
回复

使用道具 举报

发表于 17-6-2010 08:17 AM | 显示全部楼层
回复 48# xin777_88


   
  1. if(MiApp_MessageAvailable())
  2. {
  3. for(i = 0; i < rxMessage.PayloadSize; i++)
  4. consolePut(rxMessage.Payload);


  5. LED_2^=1;
  6. MiApp_DiscardMessage();
  7. }
复制代码


consolePut(rxMessage.Payload);
这里有点问题。检查看看。
回复

使用道具 举报

楼主
 楼主| 发表于 17-6-2010 10:31 AM | 显示全部楼层
回复 49# fritlizt d
哈哈对对我错了。应该是consoleput(rxMessage.Payload).我还有一个问题。由于现在我的 receiver 是用18f25k20(3.3v)而我的display circuit用的是18f4520(5v)。这样如果receiver transmit data时,会不会有问题呢?而且他们之间需要max232吗?
回复

使用道具 举报

发表于 17-6-2010 05:27 PM | 显示全部楼层
回复 50# xin777_88


   
还是有问题。看看miwi p2p的example code.
关于5v <-> 3.3v,你可以去google看看。 任何不明白可以post上来发文。
max232是 ttl <-> 232 level的level shifter,不适合用在3.3v <-> 5v.
回复

使用道具 举报

楼主
 楼主| 发表于 17-6-2010 10:18 PM | 显示全部楼层
本帖最后由 xin777_88 于 18-6-2010 05:37 PM 编辑

回复 51# fritlizt
ConsolePut(rxMessage.Payload(i)); 是不是少方挂号?不懂为什么当我放方挂号时,一按回复就不见了?至于3.3v ->5v是不是有transistor就可以了,意思是说3.3v接去base,supply 5v接 collector和 接去18f4520 的port.这样行的通吗?还有一个问题是我的visual basic 那里的coding可以不可以这样写?
  1.       Dim i As Integer

  2. Dim Word() As String
  3.         ReDim Word(Len(TextBox1.Text))
  4.         For i = 1 To Len(TextBox1.Text)
  5.             Word(i) = Mid(TextBox1.Text, i, 1)

  6.             SerialPort1.Write(Word(i))
  7.         Next
复制代码



我这样写的原因是因为我transmitter 那里的coding是:
  1. if (ConsoleIsGetReady())
  2.         {
  3.             BYTE i;
  4.         i=ConsoleGet();
  5.         MiApp_FlushTx();
  6.         MiApp_WriteData(i);
  7.         MiApp_BroadcastPacket(FALSE);
  8.        
  9.         }
  10.        
  11.         else if ( MiApp_MessageAvailable() )
  12.         MiApp_DiscardMessage();


  13.   
  14.     }
复制代码




由于上方的coding是一个一个byte 这样send。我是不是要改成send一个string?
回复

使用道具 举报

发表于 18-6-2010 08:31 PM | 显示全部楼层
回复 52# xin777_88


   

至于3.3v ->5v是不是有transistor就可以了,意思是说3.3v接去base,supply 5v接 collector和 接去18f4520 的port.这样行的通吗
有没有schematics?既然你有idea了。你可以试试看。 用multimeter verify你的result.
看看是否0v = 0v, 3.3v = 5v. 有问题欢迎再问。

关于你的program,你可以试试看。有问题欢迎post上来再问,最好是有print screen error msg或者问题的症状之类。加油。你会在testing & debugging的时候得到很多经验。
回复

使用道具 举报

楼主
 楼主| 发表于 19-6-2010 11:07 AM | 显示全部楼层
本帖最后由 fritlizt 于 20-6-2010 03:01 PM 编辑

回复 53# fritlizt
3.3v->5v 的diagram我去google找到的



我在写receive string 的coding 时,出现问题,不懂是visual basic 还是mplab,希望你可以帮我看下我的coding :


coding 如下:
  1. #include<p18f4520.h>
  2. #pragma config OSC = HS                                //hs osc
  3. #pragma config BOREN = OFF                        //no brownout reset
  4. #pragma config WDT = OFF                        //no watchdog
  5. #pragma config MCLRE = OFF                        //no mclr
  6. void sendtx( unsigned char);
  7. unsigned char recieve(void);
  8. void main (void)
  9. {
  10.         unsigned char save[];
  11.         unsigned char q;        
  12.         unsigned char *r;
  13.         unsigned char i;
  14.         unsigned char c;
  15.         RCSTA=0x90;
  16.         TXSTA=0x20;
  17.         SPBRG=16;
  18.         TXSTAbits.TXEN=1;
  19.         RCSTAbits.SPEN=1;
  20.         TRISCbits.TRISC6=0;
  21.         TRISCbits.TRISC7=1;

  22.         while(1)
  23.         {
  24.                  while(PIR1bits.RCIF==0);
  25.                 {
  26.                     *r=RCREG;
  27.                     c=*r;
  28.                 }
  29.                 i=0;
  30.                 while(*r)
  31.                 {
  32.                      save[i]=c;
  33.                      i++;
  34.                      while(PIR1bits.RCIF==0);
  35.                      c = RCREG;         
  36.                      *r++=c;
  37.                 }
  38.                 for( q=0;q<=i;q++)
  39.                 {
  40.                         sendtx(save[q]);
  41.                 }               
  42.                                                                                                         
  43.         }
  44. }               
  45. void sendtx(unsigned char c)
  46. {
  47.         TXREG=c;
  48.         while(PIR1bits.TXIF==0);
  49.         
  50. }
复制代码

   
至于visual basic 的coding 是和上一楼一样的。。
您的帮助让我感激不尽。谢谢。
回复

使用道具 举报

发表于 19-6-2010 12:36 PM | 显示全部楼层
回复 54# xin777_88


   
这个3.3v -> 5v,你可以自己用voltmeter verify.行不行的也上来update下。我不会帮你verify.

你的visual basic program,资料不足。回答不到。
print screen还有一点点的program.
button 1 是什么,
button 2 是什么?
textbox1是哪一个?
textbox2是哪一个?

我在写receive string 的coding 时,出现问题,不懂是visual basic 还是mplab,希望你可以帮我看下我的coding :
最重要的,你的问题是什么你都没说清楚。症状呢?
for ur information,以上是一个很烂的发问方式。最起码你应该讲明,你遇到什么问题, 比如说发送了,不过回复的和expected不一样, 或者发送了,不过mcu接受不到。
然后,你一定有debug一下,你也要讲明你做了什么。比如说, 从发送一个string换去发送一个byte.问题就解决了,不过发送一个string还是有问题之类。
一个print screen GUI + code.你能expect别人看到什么?
  1. # Dim i As Integer
  2. #

  3. # Dim Word() As String
  4. #         ReDim Word(Len(TextBox1.Text))
  5. #         For i = 1 To Len(TextBox1.Text)
  6. #             Word(i) = Mid(TextBox1.Text, i, 1)
  7. #

  8. #             SerialPort1.Write(Word(i))
  9. #         Next
复制代码
回复

使用道具 举报

楼主
 楼主| 发表于 19-6-2010 03:26 PM | 显示全部楼层
回复 55# fritlizt
对不起忘了注明。groupbox1=>是transmit data
button2=> 当按button2, user key in 的 data 就会透过serialport send data
groupbox2=>是receive data
button1=> 当按button1, textbox就会出现刚才user key in 的data.


我这样做的目的是要测试我的mcu coding看是否能不能利用uart收到一个string.
遇到的问题:
当我利用gui transmit string ,同时又按button1时textbox2应该会收到和user key in 的data一样的.可是当我按上button1时,我只能收到单数的data而双数的data却被 r 给取代了(上一楼的我贴的gui).我不懂为什么会这样?我在猜应该是我的mcu 的coding有问题.
至于gui只有button1和button2 有coding:


button 1
  1. TextBox2.Text = SerialPort1.ReadExisting
复制代码




button 2
  1.   Dim i As Integer
  2.         Dim z As Integer
  3.         Dim Word() As String
  4.         ReDim Word(Len(TextBox1.Text))
  5.         For i = 1 To Len(TextBox1.Text)
  6.             Word(i) = Mid(TextBox1.Text, i, 1)
  7.             For z = 1 To 200

  8.             Next
  9.             SerialPort1.Write(Word(i))
  10.         Next
复制代码
回复

使用道具 举报

发表于 20-6-2010 04:27 PM | 显示全部楼层
本帖最后由 fritlizt 于 20-6-2010 04:32 PM 编辑

回复 56# xin777_88


   
先不管你的vb program。先看你的mcu firmware.
program有问题。


第一你的algorithm. 你是要做什么?
给我个pseudo code.我看看。或者解释下你的program flow.你试图在做些什么,这样方便我了解。比如:
while(PIR1bits.RCIF==0); 等tx data,
*r=RCREG; 读取register value 之类的


接下来你的array和pointer的运用。
由于方括号会有问题。 我用代码回复。
  1. unsigned char save[];
  2. 这个有问题。 问题出现在这边-〉
  3. save[]=c;
  4. empty dimension array.这个array并没有dimension.compiler只会assign一个address给他。然后由于没有dimension.就算了。 意思是你最多可以store 1个byte的data。你可以做save[1] = 't';.不过这样做的话你会overwrite其他人的data. program会出现runtime error.你的mcu会behave到很奇怪。

  5. unsigned char q;
  6. 这个看起来没什么问题。 只要你的q <256就没问题了。看起来不会大过256

  7. unsigned char *r;
  8. 这个很有问题。pointer r.
  9. 你并没有initialize r 指去哪里。也就是说,他会指向他现在memory location里面那个location。你不知道,我不知道。 看之前process留下来什么value就是什么value. = RANDOM.
  10. 这样做你会导致runtime error.你的mcu会behave到很奇怪.假设现在r的value是0x0000,也就是null pointer.这样的话你会把rcreg的value 写进0x0000里面。假设写进一个18f4520里面根本不存在的address呢?你觉得有问题吗?
  11. 正确的用法:我看你要把rcreg丢进c 里面。
  12. 你可以一开始把r point to c.然后写入*r 即可。
  13. r = &c;
  14. *r = rcreg.
  15. 不过要写入c不用这样麻烦。直接 c = rcreg也可以。
  16. 不过接下来你的 while *r 和 *r++我就不明白要做什么用的。

  17. 最好你可以讲解你的algorithm一下。我再给意见.
复制代码
回复

使用道具 举报

楼主
 楼主| 发表于 21-6-2010 12:53 AM | 显示全部楼层
回复 57# fritlizt
我先告诉你我的概念。。。。computer---->(uart)transmitter----->(wireless)receiver------->(uart)displayboard
                           (18f25k20)          (18f25k20)                     (18f4520)
我现在做的就是要如何用18f4520去收一个message save 在array然后才decode 去binary。
我的array save()没注明就是因为不懂user会key in多少个字。如果你那么说那我不是要限制user key in 的字母?
老实告诉你*r是我上网找到的是usart的写法。可是如果没利用这个方法什么都收不到。就你所告诉我的"不过要写入c不用这样麻烦。直接 c = rcreg也可以。" 我也有式过可是就是不能,一定要*r=rcreg才可以. 还是你有更好的方法可以查看是否字母已经send完了吗?

usart 的coding如下:
void RecieveString(unsigned char * r)
{
        while(*r)
                *r++=Recieve();
}


unsigned char Recieve(void)
{
        /* retrieve one byte */
        while(!RCIF );        /* set when register is not empty */

        Bit9=RX9D;
        return RCREG;       
}



我的coding如下:
#include
#pragma config OSC = HS                                //hs osc
#pragma config BOREN = OFF                        //no brownout reset
#pragma config WDT = OFF                        //no watchdog
#pragma config MCLRE = OFF                        //no mclr
void sendtx( unsigned char);
unsigned char recieve(void);
void main (void)
{
        unsigned char save[];   
        unsigned char q;        
        unsigned char *r;
        unsigned char i;
        unsigned char c;
        RCSTA=0x90;
        TXSTA=0x20;
        SPBRG=16;
        TXSTAbits.TXEN=1;
        RCSTAbits.SPEN=1;
        TRISCbits.TRISC6=0;
        TRISCbits.TRISC7=1;

        while(1)
        {
                 while(PIR1bits.RCIF==0);   //接收第一个字母
                {
                    *r=RCREG;          //让它能够进入下来的while(*r) loop 
                    c=*r;                                 
                }
                i=0;
                while(*r)                             //这个while loop是利用来接收第二,第三.....一直到没有data为止.(不确定)
                {
                     save=c;          //把data save在array里,
                     i++;            
                     while(PIR1bits.RCIF==0);  //从第二个字母开始收.
                     c = RCREG;         
                     *r++=c;           //先把字母存在c才point 到另一个address (不决定) 
                }
                for( q=0;q<=i;q++)
                {
                        sendtx(save[q]);                  //把字母在送回去电脑查看是否对不对.
                }               
                                                                                                        
        }
}               
void sendtx(unsigned char c)
{
        TXREG=c;
        while(PIR1bits.TXIF==0);
        
}
回复

使用道具 举报

发表于 21-6-2010 08:23 AM | 显示全部楼层
回复  fritlizt
我先告诉你我的概念。。。。computer---->(uart)transmitter----->(wireless)receiver--- ...
xin777_88 发表于 21-6-2010 12:53 AM


    如果你那么说那我不是要限制user key in 的字母?
对,没错。最简单的是这样。然后如果大过max limit,你可以分段send.


还是你有更好的方法可以查看是否字母已经send完了吗
可以利用\r\n,或者null terminator '\0'


关于你的给example.由于是一个function, pass pointer as arguments,他在call function之前必须要处理了memory allocation的问题。所以这个function是没问题的.


他的function是receive到null terminator为止。你可以参考参考。 不过你的方式错了。
用简单的。给你pseudo code.


  1. array[100];
  2. i = 0;
  3. c = 1;

  4. for(i=0; c != 0; i++){
  5.     c = getrx
  6.      array[i] = c;
  7. }

  8. ........
复制代码
回复

使用道具 举报

楼主
 楼主| 发表于 21-6-2010 11:18 PM | 显示全部楼层
回复 59# fritlizt
你的方法是不错,可是如果要这样写的话,要考虑一个问题。由于rcreg会保存last value,意思是说当收完data后,rcreg会保存最后一个data而不是0.所以我在visual basic那里要send 0 当最后一个data send出去时,让它可以跳出for loop.虽然是比之前好一点,可是还是一样,只是收到单数,偶数都收不到.不懂是不是visual basic 发送太快了,而mcu来不急收呢?

新改的coding
  1. void main (void)
  2. {
  3.         unsigned char save[100];
  4.         unsigned char q;       
  5.         //unsigned char *r;
  6.         unsigned char i;
  7.         unsigned char c;
  8.         RCSTA=0x90;
  9.         TXSTA=0x20;
  10.         SPBRG=16;
  11.         TXSTAbits.TXEN=1;
  12.         RCSTAbits.SPEN=1;
  13.         TRISCbits.TRISC6=0;
  14.         TRISCbits.TRISC7=1;

  15.         while(1)
  16.         {
  17.                        
  18.         c=1;
  19.                         for(i=0;c!='0';i++)
  20.                         {
  21.                                
  22.                                 while(PIR1bits.RCIF==0);
  23.                                 {
  24.                                         c = RCREG;
  25.                                 }       
  26.                                 save[i]=c;
  27.                         }
  28.                 i--;
  29.                 for( q=0;q<=i;q++)
  30.                 {
  31.                         sendtx(save[q]);
  32.                 }               
  33.                        
  34.                
  35.                
  36.                                
  37.                
  38.         }
  39. }               
  40. void sendtx(unsigned char c)
  41. {
  42.         TXREG=c;
  43.         while(PIR1bits.TXIF==0);
  44.        
  45. }
复制代码




回复

使用道具 举报

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

本版积分规则

 WeChat
 CARI App
Get it FREE Google play
 Instagram
cari_malaysia
FOLLOW
- 版权所有 © 1996-2019 Cari Internet Sdn Bhd 佳礼网络有限公司 (483575-W) -
Private Cloud provided by IPSERVERONE
0.173312s Gzip On
快速回复 返回顶部 返回列表