|

楼主 |
发表于 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.
如果版本不一样,方法应该变动不多。
- /*******************************************************************/
- // Function ReceivedPacket will return a boolean to indicate if a
- // packet has been received by the transceiver. If a packet has been
- // received, all information will be stored in the rxFrame, structure
- // of RECEIVED_FRAME.
- /*******************************************************************/
- if( ReceivedPacket())
- {
- for(i = 0; i < rxFrame.PayLoadSize; i++)
- ConsolePut(rxFrame.PayLoad[i]);
-
- // Toggle LED2 to indicate receiving a packet.
- LED_2 ^= 1;
- DiscardPacket();
- }
复制代码 |
|
|
|
|
|
|
|

楼主 |
发表于 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
- if(MiApp_MessageAvailable())
- {
- for(i = 0; i < rxMessage.PayloadSize; i++)
- consolePut(rxMessage.Payload);
- LED_2^=1;
- MiApp_DiscardMessage();
- }
复制代码
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可以不可以这样写?- Dim i As Integer
- Dim Word() As String
- ReDim Word(Len(TextBox1.Text))
- For i = 1 To Len(TextBox1.Text)
- Word(i) = Mid(TextBox1.Text, i, 1)
- SerialPort1.Write(Word(i))
- Next
复制代码
我这样写的原因是因为我transmitter 那里的coding是:
- if (ConsoleIsGetReady())
- {
- BYTE i;
- i=ConsoleGet();
- MiApp_FlushTx();
- MiApp_WriteData(i);
- MiApp_BroadcastPacket(FALSE);
-
- }
-
- else if ( MiApp_MessageAvailable() )
- MiApp_DiscardMessage();
-
- }
复制代码
由于上方的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 如下:- #include<p18f4520.h>
- #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;
- c=*r;
- }
- i=0;
- while(*r)
- {
- save[i]=c;
- i++;
- while(PIR1bits.RCIF==0);
- c = RCREG;
- *r++=c;
- }
- for( q=0;q<=i;q++)
- {
- sendtx(save[q]);
- }
-
- }
- }
- void sendtx(unsigned char c)
- {
- TXREG=c;
- while(PIR1bits.TXIF==0);
-
- }
复制代码
至于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别人看到什么?
- # Dim i As Integer
- #
- # Dim Word() As String
- # ReDim Word(Len(TextBox1.Text))
- # For i = 1 To Len(TextBox1.Text)
- # Word(i) = Mid(TextBox1.Text, i, 1)
- #
- # SerialPort1.Write(Word(i))
- # 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
- TextBox2.Text = SerialPort1.ReadExisting
复制代码
button 2
- Dim i As Integer
- Dim z As Integer
- Dim Word() As String
- ReDim Word(Len(TextBox1.Text))
- For i = 1 To Len(TextBox1.Text)
- Word(i) = Mid(TextBox1.Text, i, 1)
- For z = 1 To 200
- Next
- SerialPort1.Write(Word(i))
- 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的运用。
由于方括号会有问题。 我用代码回复。- unsigned char save[];
- 这个有问题。 问题出现在这边-〉
- save[]=c;
- empty dimension array.这个array并没有dimension.compiler只会assign一个address给他。然后由于没有dimension.就算了。 意思是你最多可以store 1个byte的data。你可以做save[1] = 't';.不过这样做的话你会overwrite其他人的data. program会出现runtime error.你的mcu会behave到很奇怪。
- unsigned char q;
- 这个看起来没什么问题。 只要你的q <256就没问题了。看起来不会大过256
- unsigned char *r;
- 这个很有问题。pointer r.
- 你并没有initialize r 指去哪里。也就是说,他会指向他现在memory location里面那个location。你不知道,我不知道。 看之前process留下来什么value就是什么value. = RANDOM.
- 这样做你会导致runtime error.你的mcu会behave到很奇怪.假设现在r的value是0x0000,也就是null pointer.这样的话你会把rcreg的value 写进0x0000里面。假设写进一个18f4520里面根本不存在的address呢?你觉得有问题吗?
- 正确的用法:我看你要把rcreg丢进c 里面。
- 你可以一开始把r point to c.然后写入*r 即可。
- r = &c;
- *r = rcreg.
- 不过要写入c不用这样麻烦。直接 c = rcreg也可以。
- 不过接下来你的 while *r 和 *r++我就不明白要做什么用的。
- 最好你可以讲解你的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.
- array[100];
- i = 0;
- c = 1;
- for(i=0; c != 0; i++){
- c = getrx
- array[i] = c;
- }
- ........
复制代码 |
|
|
|
|
|
|
|

楼主 |
发表于 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
- void main (void)
- {
- unsigned char save[100];
- 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)
- {
-
- c=1;
- for(i=0;c!='0';i++)
- {
-
- while(PIR1bits.RCIF==0);
- {
- c = RCREG;
- }
- save[i]=c;
- }
- i--;
- for( q=0;q<=i;q++)
- {
- sendtx(save[q]);
- }
-
-
-
-
-
- }
- }
- void sendtx(unsigned char c)
- {
- TXREG=c;
- while(PIR1bits.TXIF==0);
-
- }
复制代码
 |
|
|
|
|
|
|
| |
本周最热论坛帖子
|