Run Time Error "6" Overflow

Başlatan okreg, 26 Mayıs 2014, 14:40:09

okreg

Merhaba

PIC ile Visual Basic konuşturuyorum. PC tarafından PIC'e 255'den büyük bir sayı gönderdiğimde

Run Time Error "6" Overflow

hatasını alıyorum.

PIC code
                                                                                                                                                                                                                       
Device = 18F4550
XTAL = 48	

' descriptor file, located in \inc\usb_18 - a copy
' is located in the same folder as this file	
USB_DESCRIPTOR = "USBProjectDESC.inc"

' USB Buffer...
Symbol USBBufferSizeMax = 64
Symbol USBBufferSizeTX  = 64
Symbol USBBufferSizeRX  = 64
Dim    USBBuffer[USBBufferSizeMax] As Byte

' some useful flags...
Dim PP0 As Byte SYSTEM        ' USBPOLL status return
Symbol CARRY_FLAG = STATUS.0  ' high if microcontroller does not have control over the buffer
Symbol ATTACHED_STATE = 6     ' is USB attached
     
' ************************************************************
' * main program loop - remember, you must keep the USB      *
' * connection alive with a call to USBPoll, USBIn or USBOut *
' * every couple of milliseconds or so                       *
' ************************************************************

ADCON1=15
CMCON=7


TRISD = %00000000
TRISB = %11111111
TRISA = %11111111


' ************************************************************
' * main program loop - remember, you must keep the USB      *
' * connection alive with a call to USBPoll, USBIn or USBOut *
' * every couple of milliseconds or so                       *
' ************************************************************
GoSub AttachToUSB


ProgramLoop:
USBBuffer[3] =PORTB
USBOut 1, USBBuffer, USBBufferSizeTX

USBBuffer[5] =PORTA
USBOut 1, USBBuffer, USBBufferSizeTX
   
USBIn 1, USBBuffer, USBBufferSizeRX, ProgramLoop
PORTD = USBBuffer[6]  Dig 2

GoTo ProgramLoop

' ************************************************************
' * receive data from the USB bus                            *
' ************************************************************
DoUSBIn:
   USBIn 1, USBBuffer, USBBufferSizeRX, DoUSBIn
   Return
   
' ************************************************************
' * transmit data                                            *
' ************************************************************
DoUSBOut:   
   USBOut 1, USBBuffer, USBBufferSizeTX, DoUSBOut
   Return

' ************************************************************
' * wait for USB interface to attach                         *
' ************************************************************
AttachToUSB:
   Repeat								
      USBPoll		
   Until PP0 = ATTACHED_STATE
   Return


Basic code
' vendor and product IDs
Private Const VendorID = 6017
Private Const ProductID = 2000

' read and write buffers
Private Const BufferInSize = 64
Private Const BufferOutSize = 64
Dim BufferIn(0 To BufferInSize) As Byte
Dim BufferOut(0 To BufferOutSize) As Byte
Private Sub Form_Load()
App.Title = Me.Caption
ConnectToHID (Me.hwnd)
aaa = 0
End Sub
Private Sub Form_Unload(Cancel As Integer)
BufferOut(1) = 0
hidWriteEx VendorID, ProductID, BufferOut(0)
DisconnectFromHID
End Sub
Public Sub OnPlugged(ByVal pHandle As Long)
If hidGetVendorID(pHandle) = VendorID And hidGetProductID(pHandle) = ProductID Then
Timer1.Enabled = True
End If
End Sub
Public Sub OnUnplugged(ByVal pHandle As Long)
If hidGetVendorID(pHandle) = VendorID And hidGetProductID(pHandle) = ProductID Then
Timer1.Enabled = False
End If
End Sub
Public Sub OnChanged()
Dim DeviceHandle As Long
' get the handle of the device we are interested in, then set
' its read notify flag to true - this ensures you get a read
' notification message when there is some data to read...
DeviceHandle = hidGetHandle(VendorID, ProductID)
hidSetReadNotify DeviceHandle, True
End Sub
Public Sub OnRead(ByVal pHandle As Long)
' read the data (don't forget, pass the whole array)...
If hidRead(pHandle, BufferIn(0)) Then
' first byte is the report ID, e.g. BufferIn(0)
' the other bytes are the data from the microcontrolller...
Label1.Caption = BufferIn(1)
Label7.Caption = BufferIn(2)
Label8.Caption = BufferIn(3)
Label9.Caption = BufferIn(4)
Label10.Caption = BufferIn(5)
Label11.Caption = BufferIn(6)
Label12.Caption = BufferIn(7)
Label13.Caption = BufferIn(8)

End If

End Sub
Public Sub WriteSomeData()
BufferOut(0) = 0 ' first by is always the report ID
BufferOut(1) = 10 ' first data item, etc etc
' write the data (don't forget, pass the whole array)...
hidWriteEx VendorID, ProductID, BufferOut(0)
End Sub

Kabil ATICI

Dim BufferIn(0 To BufferInSize) As Byte
Dim BufferOut(0 To BufferOutSize) As Byte
zaten bayt vermişsin. Eğer 255 üzerinde değer verirsen hata verir. bayt vermezsen muhtemelen yine hata verir. (USB iletişim şeklinden)
ambar7

okreg

Alıntı yapılan: ambar7 - 26 Mayıs 2014, 17:29:06
Dim BufferIn(0 To BufferInSize) As Byte
Dim BufferOut(0 To BufferOutSize) As Byte
zaten bayt vermişsin. Eğer 255 üzerinde değer verirsen hata verir. bayt vermezsen muhtemelen yine hata verir. (USB iletişim şeklinden)

BufferSize 64 byte tanımlı ama?

Private Const BufferInSize = 64
Private Const BufferOutSize = 64
Dim BufferIn(0 To BufferInSize) As Byte
Dim BufferOut(0 To BufferOutSize) As Byte

Kabil ATICI

Dim BufferIn(0 To BufferInSize) As Byte
Dim BufferOut(0 To BufferOutSize) As Byte
sen parantez içine bakıyorsun ama asıl dışına bak. Çünkü programın takıldığı dışı. Bu bir dizi ve dizinin her bir elemanı Bayt olarak tanımlı...


açarsak
BufferIn(0)--->bayt
BufferIn(1)--->bayt
...
BufferIn(63)--->bayt

aynı şekilde

BufferOut(0)--->bayt
BufferOut(1)--->bayt
...
BufferOut(63)--->bayt


ambar7

okreg

Alıntı yapılan: ambar7 - 26 Mayıs 2014, 21:30:01
Dim BufferIn(0 To BufferInSize) As Byte
Dim BufferOut(0 To BufferOutSize) As Byte
sen parantez içine bakıyorsun ama asıl dışına bak. Çünkü programın takıldığı dışı. Bu bir dizi ve dizinin her bir elemanı Bayt olarak tanımlı...


açarsak
BufferIn(0)--->bayt
BufferIn(1)--->bayt
...
BufferIn(63)--->bayt

aynı şekilde

BufferOut(0)--->bayt
BufferOut(1)--->bayt
...
BufferOut(63)--->bayt




anladım. teşekkürler

peki her bir buffer'ı 8bit üzerinde tanımlamak mümkün mü? gerçi ilk mailde olmaz demişsiniz..

Gökhan BEKEN

Alıntı yapılan: okreg - 26 Mayıs 2014, 21:52:51
anladım. teşekkürler

peki her bir buffer'ı 8bit üzerinde tanımlamak mümkün mü? gerçi ilk mailde olmaz demişsiniz..
1 byte=8 bit
bu bilişim dünyasının kanunu, bunu değiştirmek yerine basit bir protokol oluşturun.
her 2 byte'ın sonuna özel bir karakter koyun, mesela '$' koyun.
Örnek:
16 bitlik sayılarınız var diyelim: 0x4415, 0x546A, 0x47E5, 0x87F1
verileri bu şekilde gönderin 0x44,0x15,$,0x54,0x6A,$,0x47,0xE5,$,0x87,0xF1,$
alıcı ise $ işaretleri arasındaki aldığı sayıları birleştirip 2 byte yani 16 bit olarak alsın.
sonuç olarak, veriler şu hale gelecek tekrar: 0x4415, 0x546A, 0x47E5, 0x87F1

bu sayede 64 bitlik(ya da daha fazla) bile veri aktarabilirsiniz.
Özel mesaj okumuyorum, lütfen göndermeyin.

okreg

Alıntı yapılan: meftun - 26 Mayıs 2014, 22:24:40
1 byte=8 bit
bu bilişim dünyasının kanunu, bunu değiştirmek yerine basit bir protokol oluşturun.
her 2 byte'ın sonuna özel bir karakter koyun, mesela '$' koyun.
Örnek:
16 bitlik sayılarınız var diyelim: 0x4415, 0x546A, 0x47E5, 0x87F1
verileri bu şekilde gönderin 0x44,0x15,$,0x54,0x6A,$,0x47,0xE5,$,0x87,0xF1,$
alıcı ise $ işaretleri arasındaki aldığı sayıları birleştirip 2 byte yani 16 bit olarak alsın.
sonuç olarak, veriler şu hale gelecek tekrar: 0x4415, 0x546A, 0x47E5, 0x87F1

bu sayede 64 bitlik(ya da daha fazla) bile veri aktarabilirsiniz.

yani 2 farklı bufferdan aldığım verileri bir komut ile birleştireceğim

buffer(1) den aldığımı aa değişkenine atadım
buffer(2) den aldığımı bb değişkenine atadım

cc = aa birleştir bb

bu komut nedir?


Gökhan BEKEN

#7
Buffer derken neyi kastettiğinizi anlamadım.
unsigned char ya da byte türünden bir dizi değişkeniniz olacak.
Diyelimki 16 bitlik veri tutacaksınız. 2 byte eder, bu durumda 2 elemanlık bir byte dizisi kullanabilirsiniz.

Kabaca böyle:
byte buffer[2];
byte sayac=0;
int gercekSayi=0;
serialPort1_DataReceived{

  if(gelen='$'){ //2 byte'lık veri alma işlemi tamamlanmış
    gercekSayi=buffer[0]+(256*buffer[1]);
    sayac=0; 
  }
  else{//2 byte'lık veriler hala alınıyor
    buffer[sayac]=gelen;  sayac++;
  }
}


mesaj birleştirme:: 27 Mayıs 2014, 11:16:58

Alıntı yapılan: okreg - 27 Mayıs 2014, 09:57:34
yani 2 farklı bufferdan aldığım verileri bir komut ile birleştireceğim

buffer(1) den aldığımı aa değişkenine atadım
buffer(2) den aldığımı bb değişkenine atadım

cc = aa birleştir bb

bu komut nedir?
Yukarıdaki
gercekSayi=buffer[0]+(256*buffer[1]);
satırı bu işi yapıyor.
Bir sayıyı 256 ile çarparsanız o sayıyı 1 byte sola kaydırmış olursunuz.
örnek:
0b01001010=0x4A=74
74*256=18944 eder
0b0100101000000000=0x4A00=18944

gördüğünüz gibi o bitler olduğu gibi sola kaydı, sağ tarafta 8 bitlik boş bitler oluştu.
O bitleride toplama işlemi ile diğer sayıyı ekleyerek dolduruyoruz: buffer[0]+(256*buffer[1]);
Özel mesaj okumuyorum, lütfen göndermeyin.

okreg

Alıntı yapılan: meftun - 27 Mayıs 2014, 11:02:59
Buffer derken neyi kastettiğinizi anlamadım.
unsigned char ya da byte türünden bir dizi değişkeniniz olacak.
Diyelimki 16 bitlik veri tutacaksınız. 2 byte eder, bu durumda 2 elemanlık bir byte dizisi kullanabilirsiniz.

Kabaca böyle:
byte buffer[2];
byte sayac=0;
int gercekSayi=0;
serialPort1_DataReceived{

  if(gelen='$'){ //2 byte'lık veri alma işlemi tamamlanmış
    gercekSayi=buffer[0]+(256*buffer[1]);
    sayac=0; 
  }
  else{//2 byte'lık veriler hala alınıyor
    buffer[sayac]=gelen;  sayac++;
  }
}


mesaj birleştirme:: 28 Mayıs 2014, 11:16:58
Yukarıdaki
gercekSayi=buffer[0]+(256*buffer[1]);
satırı bu işi yapıyor.
Bir sayıyı 256 ile çarparsanız o sayıyı 1 byte sola kaydırmış olursunuz.
örnek:
0b01001010=0x4A=74
74*256=18944 eder
0b0100101000000000=0x4A00=18944

gördüğünüz gibi o bitler olduğu gibi sola kaydı, sağ tarafta 8 bitlik boş bitler oluştu.
O bitleride toplama işlemi ile diğer sayıyı ekleyerek dolduruyoruz: buffer[0]+(256*buffer[1]);

anladım teşekkürler
elinize sağlık