Erreur 63 : Serial Port receive buffer overflow
Hello
J'ai un problème avec les blocs get.vi dans mon programme
Je fais une boucle for qui compte les heures et après environ 200-300 fois j'ai une erreur qui survient (erreur 63 : Serial Port receive buffer overflow)
A l'intérieur de la boucle j'exécute la commande get.vi plusieurs fois pour différents cas à chaque incrémentation de 1h.
Merci d'avance
En annexe, mon vi principal
Pièces jointes :
regulation.vi 462 KB
Du fait de certains vi manquants je ne peux pas executer votre code, Parmis le nombre important de vi GET HTTP, savez-vous lequel est responsable de l'erreur ?, et est-ce toujours le même ?
L'erreur renvoyée concerne le port série, quelle est la configuration de ses buffers d'entrée / sortie (visible dans le gestionnaire de périphérique)
Cordialement,
Vincent.O
National Instruments France
#adMrkt{text-align: center;font-size:11px; font-weight: bold;} #adMrkt a {text-decoration: none;} #adMrkt a:hover{font-size: 9px;} #adMrkt a span{display: none;} #adMrkt a:hover span{display: block;}
Été de LabVIEW 2014
12 présentations en ligne, du 30 juin au 18 juillet
Similar Messages
-
How to get data from serial port to GUI textArea
From Serial Port.....
Messages from base (always 5 bytes):
0xAA, 0, 0, 0, 0xBB - IDLE Mode
0xAA, 0, 0x80, 0x80, 0xBB - Question Mode
messages from terminal (always 6 bytes):
0xAA, a, b, c, chksum, 0xBB
where chksum = a+b+c;
a = address (0-250)
the 2 MSB's of b represenet the answer:
0 0 - A
0 1 - B
1 0 - C
1 1 - D
the 6LSB's of b and 8bits of c is the time for answer, in milliseconds.
(0-16384 milliseconds)
I have VB Code for that but I want the same thing in Java ...
Can any one help me?
Here's VB Code..
VERSION 5.00
Object = "{648A5603-2C6E-101B-82B6-000000000014}#1.1#0"; "MSCOMM32.OCX"
Begin VB.Form Form1
BorderStyle = 1 'Fixed Single
Caption = "Aakar GUI"
ClientHeight = 4665
ClientLeft = 60
ClientTop = 375
ClientWidth = 6105
LinkTopic = "Form1"
MaxButton = 0 'False
MinButton = 0 'False
ScaleHeight = 311
ScaleMode = 3 'Pixel
ScaleWidth = 407
StartUpPosition = 3 'Windows Default
Begin VB.CommandButton cmdPort
Caption = "Open Port"
Height = 375
Left = 120
TabIndex = 4
Top = 600
Width = 1455
End
Begin VB.ComboBox cmbPort
Height = 315
ItemData = "Form1.frx":0000
Left = 120
List = "Form1.frx":0016
Style = 2 'Dropdown List
TabIndex = 3
Top = 120
Width = 2895
End
Begin VB.CommandButton cmdEnd
Caption = "End"
Height = 495
Left = 1560
TabIndex = 2
Top = 1320
Width = 1215
End
Begin VB.CommandButton cmdStart
Caption = "Start"
Height = 495
Left = 120
TabIndex = 1
Top = 1320
Width = 1215
End
Begin VB.TextBox txtMessage
Height = 2040
Left = 119
MultiLine = -1 'True
ScrollBars = 3 'Both
TabIndex = 0
Top = 2475
Width = 5848
End
Begin VB.Timer tmrRead
Enabled = 0 'False
Interval = 1
Left = 2040
Top = 600
End
Begin MSCommLib.MSComm MSComm1
Left = 3120
Top = 360
_ExtentX = 1164
_ExtentY = 1164
_Version = 393216
DTREnable = 0 'False
ParityReplace = 45
SThreshold = 1
End
Begin VB.Label Label5
Caption = "Result Data:"
Height = 375
Left = 120
TabIndex = 5
Top = 2115
Width = 1320
End
End
Attribute VB_Name = "Form1"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = False
Option Explicit
Dim PortIsOpen As Boolean
Dim Answers(4) As String
Dim RejectKeystroke As Boolean
Private Sub cmbPort_Change()
Debug.Print cmbPort.ListIndex
End Sub
Private Sub cmbPort_Validate(Cancel As Boolean)
'Cancel = True
End Sub
Private Sub cmdEnd_Click()
MSComm1.Output = "e"
txtMessage.Text = ""
End Sub
Private Sub cmdPort_Click()
On Error GoTo ErrorHandler
If cmbPort.ListIndex < 0 Then Exit Sub
If PortIsOpen Then
cmbPort.Enabled = True
MSComm1.PortOpen = False
PortIsOpen = False
cmdPort.Caption = "Open Port"
cmdStart.Enabled = False
cmdEnd.Enabled = False
Else
MSComm1.CommPort = cmbPort.ListIndex + 1
cmbPort.Enabled = False
MSComm1.PortOpen = True
PortIsOpen = True
cmdPort.Caption = "Close Port"
cmdStart.Enabled = True
cmdEnd.Enabled = True
End If
Exit Sub
ErrorHandler:
Debug.Print Err.Number
Debug.Print Err.Description
MsgBox Err.Description, vbExclamation Or vbOKOnly, "Error opening port"
cmbPort.Enabled = True
PortIsOpen = False
cmdPort.Caption = "Open Port"
cmdStart.Enabled = False
cmdEnd.Enabled = False
End Sub
Private Sub cmdStart_Click()
MSComm1.Output = "s"
txtMessage.Text = ""
End Sub
Private Sub Form_Initialize()
Dim tmp As Variant
tmp = InitCommonControls
End Sub
Private Sub Form_Load()
Answers(0) = "A"
Answers(1) = "B"
Answers(2) = "C"
Answers(3) = "D"
'MSComm1.Settings = "9600,n,8,1"
''MSComm1.Settings = "115200,n,8,1"
'MSComm1.PortOpen = True
On Error GoTo ErrorHandler1
MSComm1.CommPort = 1 ' comm port 1
MSComm1.RThreshold = 1 ' use 'on comm' event processing
MSComm1.Settings = "9600,n,8,1" ' baud, parity, data bits, stop bits
MSComm1.SThreshold = 1 ' allows us to track Tx LED
MSComm1.InputMode = comInputModeText 'comInputModeBinary ' binary mode, you can also use
' comInputModeText for text only use
PortIsOpen = False
cmbPort.ListIndex = 0
' open the port
MSComm1.PortOpen = True
cmbPort.Enabled = False
PortIsOpen = True
cmdPort.Caption = "Close Port"
cmdStart.Enabled = True
cmdEnd.Enabled = True
Exit Sub
ErrorHandler1:
Debug.Print Err.Description
PortIsOpen = False
cmbPort.Enabled = True
cmdPort.Caption = "Open Port"
cmdStart.Enabled = False
cmdEnd.Enabled = False
End Sub
Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
If MSComm1.PortOpen Then MSComm1.PortOpen = False
End Sub
Private Sub lblOption_Click()
End Sub
Private Sub MSComm1_OnComm()
' Synopsis: Handle incoming characters, 'On Comm' Event
' Description: By setting MSComm1.RThreshold = 1, this event will fire for
' each character that arrives in the comm controls input buffer.
' Set MSComm1.RThreshold = 0 if you want to poll the control
' yourself, either via a TImer or within program execution loop.
' In most cases, OnComm Event processing shown here is the prefered
' method of processing incoming characters.
Dim i As Long
Dim sBuff As String ' buffer for holding incoming characters
Const MTC As String = vbCrLf ' message terminator characters (ususally vbCrLf)
Const LenMTC As Long = 2 ' number of terminator characters, must match MTC
Dim iPtr As Long ' pointer to terminatior character
' OnComm fires for multiple Events
' so get the Event ID & process
Select Case MSComm1.CommEvent
' Received RThreshold # of chars, in our case 1.
Case comEvReceive
' read all of the characters from the input buffer
' StrConv() is required when using MSComm in binary mode,
' if you set MSComm1.InputMode = comInputModeText, it's not required
'sBuff = sBuff & StrConv(MSComm1.Input, vbUnicode)
'If Len(txtMessage.Text) > 4096 Then txtMessage.Text = ""
sBuff = MSComm1.Input
Dim ch As String
Dim PacketStart As Boolean
Dim PacketLength As Integer
Dim Packet() As String
PacketStart = False
PacketLength = 0
While (Len(sBuff) > 0)
ch = Left(sBuff, 1)
If (ch = Chr(&HAA)) Then PacketStart = True
If (ch = Chr(&HBB)) Then PacketStart = False
If (ch <> Chr(&HAA) And ch <> Chr(&HBB)) Then
PacketLength = PacketLength + 1
ReDim Preserve Packet(PacketLength)
Packet(PacketLength) = ch
End If
'txtMessage.Text = txtMessage.Text + Format(Hex(Asc(ch)), " @@")
sBuff = Right(sBuff, Len(sBuff) - 1)
Wend
If (PacketLength = 3) Then
Debug.Print "Command packet recieved"
'txtMessage.Text = txtMessage.Text + vbCrLf + "Address =" + Str(Asc(Packet(1)))
'txtMessage.Text = txtMessage.Text + vbCrLf + "Address =" + Str(Asc(Packet(2)))
End If
If (PacketLength = 4) Then
Debug.Print "Response packet recieved"
txtMessage.Text = txtMessage.Text + "Address =" + Str(Asc(Packet(1))) + _
" Answer = " + Answers((Asc(Packet(2)) And &HC0) / 64) + _
" Time =" + Str((Asc(Packet(2)) And &H3F) * 256 + (Asc(Packet(3)))) + "mS" + vbCrLf
'txtMessage.Text = txtMessage.Text + vbCrLf + "Address =" + Str(Asc(Packet(1)))
'txtMessage.Text = txtMessage.Text + vbCrLf + "Option =" + Str((Asc(Packet(2)) And &HC0) / 64)
'txtMessage.Text = txtMessage.Text + vbCrLf + "Time =" + Str((Asc(Packet(2)) And &H3F) * 256 + (Asc(Packet(3))))
End If
If (PacketLength <> 4 And PacketLength <> 3) Then Debug.Print "Unknown packet of length" + Str(PacketLength) + " recieved"
txtMessage.Text = txtMessage.Text + vbCrLf
' An EOF charater was found in the input stream
Case comEvEOF
DoEvents
' There are SThreshold number of characters in the transmit buffer.
Case comEvSend
DoEvents
' A Break was received.
Case comEventBreak
DoEvents
' Framing Error
Case comEventFrame
DoEvents
' Data Lost.
Case comEventOverrun
DoEvents
' Receive buffer overflow.
Case comEventRxOver
DoEvents
' Parity Error.
Case comEventRxParity
DoEvents
' Transmit buffer full.
Case comEventTxFull
' Unexpected error retrieving DCB]
Case comEventDCB
DoEvents
End Select
End Sub
Private Sub tmrRead_Timer()
'MSComm1.Output = vbCrLf + vbCrLf
'MSComm1.Output = Chr(128)
End Sub
Private Sub txtMessage_KeyDown(KeyCode As Integer, Shift As Integer)
If Shift = 2 Or Shift = 4 Then RejectKeystroke = False Else RejectKeystroke = True
End Sub
Private Sub txtMessage_KeyPress(KeyAscii As Integer)
If RejectKeystroke Then
KeyAscii = 0
End If
End SubThanks in advance..I want to replicate the entire VB program as Java Program.
This has to be included in my project which i am doing in java. -
Hello All,
I am developing Teststand sequences which run Labview code. I use 1 labview vi to configure and drive the serial port, the first call configures the serial port. The second call writes a message and reads the response, the last call releases the resource. When running the call write&read I intermittently receive the error shown in the attached jpg, this causes my whole sequence to lockup till I return to restart the test. I need to run this repeatedly overnight so its a problem. I have a feeling this isnt so much a serial port overrun problem as a hardware clash ( i also configure and run a camera ).
I have spotted a number of posts a on this same topic but I havent yet found a soultion only advice, which I have already tried.
Help greatly appreciated
Regards Chris
Attachments:
Serial Port Error.jpg 63 KBAre you familiar with handshaking? There were several posts on this subject recently. The end device is sending data faster than your computer and Labview program can handle. You need to implement handshaking. There are two types of handshaking, software and hardware:
Software, also called XON/XOFF. With this setup, when the computer serial port incoming buffer gets nearly full, it automatically sends an XOFF command (don't worry about what it is since it is automatic). The XOFF command tells the endpoint device to stop sending data. When the buffer gets near empty, the computer sends an XON command. The endpoint device then starts sending data again. For this protocol, the endpoint device must be able to support this, and must be configured to use this type of handshaking. You would have to read the manual to find out how to set it up. For the computer end, you can set it up with an option for the configure serial port function on the input labeled "Flow Control". Right click on this terminal and select Create - Constant. A text ring will be created. Select XON/XOFF in the text ring.
Hardware, also called RTS/CTS. Same principle in that the computer signals the endpoint when to stop sending data and when to start again. However, instead of sending a command, the computer drops the CTS line (Clear To Send). Actually, the endpoint device raises the RTS (Request To Send) when it wants to send data, and the computer responds with raising CTS if it is ready to receive data. When the buffers get full, the computer drops CTS which tells the endpoint to stop sending data. When the computer is ready to start receiving again, it raises CTS. Again, both sides must be configured for this. The text ring has an RTS/CTS selection.
You will have to read the manual on your endpoint device to see what it supports and how to configure it. Warning: If sending binary data, DO NOT use XON/XOFF. The binary data may just happen to form a pattern that looks like XOFF, and everything will lock up because XON will never be sent. So if binary data is being transferred, use RTS/CTS. If normal ASCII characters are being sent, you can use either protocol.
- tbob
Inventor of the WORM Global -
UDP receive buffer default size
Hi,
I have an issue regarding receiving data over UDP:
Description of the problem:
A 3rd party application is retrieving measurement data from a MGC+ at 2400 Hz.
All samples are then streamed to an UDP port locally.
I then use a labview application to read the data and do some processing.
The issue is, at 2400 Hz i loose a lot of packets due to UDP receive buffer overflow, i.e. new data appears before all old data is read.
This is because data is comming in uneven bursts, 10-20 times each second.
I have tried increasying the UDP receive buffer size according to this:
http://digital.ni.com/public.nsf/allkb/D5AC7E8AE545322D8625730100604F2D
And it seems to solve the problem.
But here arises another issue:
If i modify the UDP buffer size while the 3rd party application is running, the 3rd party application will crash.
Therefore, my question is:
Is there any way to modify the default UDP receive buffer size in windows?
Such that when the UDP connection is opened, it will have a buffer size of for example 32768, regardless of which application that accesses the UDP connection first?
Solved!
Go to Solution.Are you reading and processing the data in the same section of code? If you are I would suggest that you split your processing task from the receiving task. The receive task would do nothing more than read from the UDP connection and post that data to a queue. This should be able to keep up with the buffer. Your processing task will run in parallel and the queue will allow you to buffer the data while you are processing without affecting the UDP buffer.
Mark Yedinak
"Does anyone know where the love of God goes when the waves turn the minutes to hours?"
Wreck of the Edmund Fitzgerald - Gordon Lightfoot -
How to empty Serial port buffer ???
Hi!
I am having problems with serial port. I want to clear i
serial ports buffer, but i dont know how to do this. I am receiving NMEA data through that port and every now and then i need to clear it because there are too much data and i dont need them all. Could someone please help me?Hi,
Take a look at this link.
http://www.sc-systems.com/JavaDoc/Serialio.SerOutputStream.html
flush
public void flush() throws IOException
Causes any buffered data on the output stream to be written. Note: when using txDrain be advised that some OS's (like WinNT) do not provide a timeout on the OS level drain/flush call. In this case if handshake (flow control) is disabled from the far end your txDrain call will block until drain can complete. (i.e. until the handshake state changes). Because of this the default mechanism for flush is to watch the txBuffer. This will allow you to abort a stalled OutputStream since your code will not be locked up at the native level.
Throws: IOException
if an error occurs. Overrides:
flush in class OutputStream
However the above function and the class defining this is not provided by SUN.
I hope this helped.
Roopasri Vittal
Developer Technical Support
Sun Microsystems
http://sun.com/developers/support -
Empty serial port buffer?
Is it possible to empty the buffer of the serial input port without reading from it?
izze wrote in news:5065000000080000002B8B0000-
[email protected]:
> Is it possible to empty the buffer of the serial input port without
> reading from it?
You have several options.
Old standard serial VI's
Use "Bytes at Serial Port" to get number of byte present and wire it to
"Serial Port Read" and don't use the data from the VI.
VISA flush buffer
The function "VISA Flush I/O Buffer".
This did not work for me, it took to long time.
VISA eqvivalent of number of bytes at serial port.
There is a VISA property to read number of bytes on the receive buffer of
the serial port. Use this to get number of bytes and wire this number to
the VISAread function.
The pro
blem is that this only works for serial port.
Use VISA read
-1- Get VISA timeout value (VISA property node)
-2- Set VISA timout to 0 (VISA property node)
-3- make a while loop with
VISA read function with e.g 1000 bytes to read.
End the while loop when number of bytes read is 0
-4- Set VISA timeout back to the value set in step 1
Rolf -
Java program to receive byte from serial port
hello everyone, i am recently working one a project which require communication between pic16f877 and PC. My pic continuiously measure a voltage and send the result (a byte ranging from 0 to 255) to the rs232 port. One the pc side, my java program keep reading the serial port and it works for values 0~127 and 160~255. But if the byte value is between 127 and 160, it cannot received correctly, i get something like 375,8224,or even 65532 etc(no obvious path but more likely to be 300+,700+,8000+ or 65500+). I have been trying very hard to solve this and i think the problem is due to the pc software. I am feeling so frustrated and any suggestion will be much appreciated.
p.s. : i used Bufferedreader.read() in my program
--mengyaofumengyao wrote:
hello everyone, i am recently working one a project which require communication between pic16f877 and PC. My pic continuiously measure a voltage and send the result (a byte ranging from 0 to 255) to the rs232 port. One the pc side, my java program keep reading the serial port and it works for values 0~127 and 160~255. But if the byte value is between 127 and 160, it cannot received correctly, i get something like 375,8224,or even 65532 etc(no obvious path but more likely to be 300+,700+,8000+ or 65500+). I have been trying very hard to solve this and i think the problem is due to the pc software. I am feeling so frustrated and any suggestion will be much appreciated.
p.s. : i used Bufferedreader.read() in my program
--mengyaothis may not matter in your case - but don't use a Reader, use a Stream (BufferedInputStream maybe) -
hello sir,
I am developing a GUI screen from that i want to write and read a hex file from the flash buffer of the microcontroller through the USB serial port. the driver i am using is FTDID2XX driver.if anyone having examples of loading file through serial port.Please reply me .
ThanksLooks like you should post your request in the LabVIEW forum, this one here preferentially is for LabWindows/CVI...
-
Serial Port buffer is annoying.
Hi, I'm having a hard time dealing with my serial port. When I send a command (for instance, 'Whello', which should display 'hello' on the instrument panel), it doesn't seem to actually send. If I send Whellowoiaydsociahncu4ynriausfaiu(insert at least 80 characters), the display will read "hellowoiayds" (the display is 12 characters wide).
So how in the world do I tell the COM port to send the command without requiring all 80 characters? Note that I can have it send "W1234567890" and press send 8 times, and the command will be sent on the 10th attempt. I assume the buffer is being filled as I send the short command, and only actually sends after it is full. If I don't send something to the buffer within 2 seconds, the buffer is cleared.
Is this a computer problem or programming thing? I've tried turning off FIFO, but it didn't help (maybe I have to reboot to make that setting work?)
Thanks for your help,
-JamesHave you tried to place a \n (linefeed) at the end of your buffer. Many serial instruments that I am familiar with (note that I am NOT an expert on serial instruments) typically use a line buffer for parsing and don't start to parse until they get a complete line (80 characters) or detect the end of input with a carraige return or linefeed (or both). So, you may consider sending "whello\n" or "whello\r\n".
Good luck... -
Warning 1073676424 from VISA Set I/O Buffer Size.vi on a serial port
I am porting an application from LabVIEW 6.1 on Windows to LabVIEW 7 on OS X (Mac). It was very painless except some GUI modifications.
The application involves 30 KB data from a instrument through a RS232 serial port. I found the application misses data whenever the computer is busy. The problem came down to the unchanged buffer size.
Attempt to change the buffer size of a serial port with "VISA Set I/O Buffer Size.vi" fails with a warning of 1073676424 (The specified I/O buffer is not supported). Even the example vi from NI web site "Advanced _Serial_Write_and_Read.vi" has the same warning.
I wonder what I am missing.Under the hood VISA is using the POSIX serial interface for Mac OS X (same as for Linux and Solaris). This interface does not support changing the buffer size. Hence, the buffer size is fixed to the internal OS buffer size. The only thing that changing the buffer size will do (for the out buffer) is to have VISA not flush the data after every write. This is a limitation in the serial API for Mac OS X. Therefore, VISA reports a warning.
-
Serial-Buffer overflow without too much incoming data or bursts on the line
My application runs under LabView 5.11 on a W2000 platform.
After a couple of hours trouble-free working, the sub-vi "bytes at serial port" gives out 57351 Bytes. That is 56k + 7Bytes, which is the normal Datablock coming in at the port.
Effect is that the "serial port read-vi" and as result the complete application hangs up.
I have allready found out that this data set does not arrive at the port.
Could this be a problem of LabView 5.11 running under W2000?I would first urge you to disconnect the cable from the serial port and let it run more than long enough to convince yourself the error goes away or re-occurs.
If you disconnect, and the error still occurs, your port hardware may be bad. Try another port or PC.
If the problem goes away, you could have noise on the line (interference, bad ground, bad conections, excesive long cable, etc, etc) or,
your code is not coming back to read the port often enough. If you think this is the case, read from the port more often or use hardware handshaking.
I would like to know a lot more before saying it is a software in-compatability issue.
Keep us updated,
Ben
(An LOTR fan)
Ben Rayner
I am currently active on.. MainStream Preppers
Rayner's Ridge is under construction -
URGENT: Capturing data through serial port
Hi,
My problem is with the use of javax.comm API. I have an RFID tag reader connected to
the serial port. It is a handheld reader and reads tags when its trigger is pulled. The
data that is read is sent to the serial port. This is what I want to capture.
I tried to test the reading operation by running the SimpleRead sample. What I see is
that I pull the trigger once to read 1 tag, but that generates 3 DATA_AVAILABLE events.
The tag ID that is read is 16 bytes, preceded by a 3 byte AIM Identifier (that declares
the following data was read from an RFID tag, and not a barcode which has different
AIM Identifiers for the different symbologies - but I digress.) By inserting some println's,
I was able to see that the 19 bytes of data are read 8 bytes at a time. The first 8 bytes
are read on the first DATA_AVAILABLE event, the next 8 are read on the second event
and the last 3 bytes are read on the 3rd DATA_AVAILABLE event.
This is strange & not good for me. How can my application know that the data read in
these 3 separate DATA_AVAILABLE events is to be concatenated to form a single
tag ID? Why is the single trigger-pull & tag read operation broken up into chunks of
8 bytes? Is there some configuration setting that will give me the behavior I want?
(I cannot rely on the length of the tag ID being 16 bytes always, because the same
reader will also be reading barcodes where the data may have varying length)
Thanks for any help. This is really urgent.
- Ajoyplease use the [ code ]and [code ] tags for code.
I don't think you have a problem with the code, it's more like understanding how to make it work.
to make the read method return.You do not have a read() method.
The code is behaving as it should.
You need to use the SimpleRead class as a thread, add and remove the Serial port listener as needed.
You read all data available, then send it to a method to parse the buffer.
You can count how much data was read so you know how much to parse.
I never used receive threshhold.
Here is example (sample)of my serial port reader
//SerialIO
public void serialEvent(SerialPortEvent event) {
switch(event.getEventType()) {
case SerialPortEvent.OUTPUT_BUFFER_EMPTY:
break;
case SerialPortEvent.DATA_AVAILABLE:
this.dataManager.readData();
//DataManager
public void readData() {
String str;
int bytes = 0;
long endTime, now;
try {
while (this.owner.isComPortOpen
&& (SerialIO.inStream.available() > 0)) {
bytes = SerilIO.inStream.read(this.buffer);
if (bytes > 0) {
if (bytes > this.buffer.length) {
System.out.println( ": Input buffer overflow!");
**Here is where you parse your buffer
sendDataToParser(bytes, buffer);
} catch (IOException ex) {
System.out.println( ": Cannot read input stream");
* Stops the serialEvent listener
protected void stopSerialEvent() {
SerialIO.serialPort.removeEventListener();
try {
Thread.sleep(2000);
flushInputStream();
} catch (InterruptedException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
* Starts the Serial event listener
protected void startSerialEvent() {
// TODO Auto-generated method stub
try {
SerialIO.serialPort.addEventListener(SerialIO);
} catch (TooManyListenersException e) {
// TODO Auto-generated catch block
//System.out.println("startSerialEvent in dataManager");
e.printStackTrace(); -
Send DAQ measurement results through serial ports
Hi, All
I use PCI-6034E for measurement. After DAQ gets data, I send them to another computer through serial port (com1). I write a Virtual C++ program, which calls NI-DAQ library functions to implement DAQ data sampling (multiple channel scan) and sends measurement data to another computer through serial port under request. DAQ data sampling and serial communication are implemented in two threads. They are running concurrently. They share a global memory for measurement data. The serial communication thread will do infinite wait and send data only when another computer sends a request through serial port.
I met two problems. First, when I reduce the size of DAQ measurement buffers (piBuffer and halfpiBuffer, I us
edouble buffer model), DAQ measurement is often interrupted by the message "[DAQ_DB_HalfReady] returned NI-DAQ warning 10846. Your application was unable to retrive data from the background acquisition buffer fast enough so the unretrieved data was overwritten with new data. ...". I want to get run time data so I need to reduce the buffers as small as possible. How can I solve it ? The second problem is that the serial port gets error data (nothing) from measurement computer sometimes, especially when DAQ initializes itself and finishes work. It looks like that there is a conflict between DAQ and serial port. Does anyone have similar experience about this? Any suggestion?
Thank you in advance.
Le CaiLe Cai,
You are correct that the number of scans to read is equal to half of the buffer in double buffer mode. I was mistaken and referring to a standard (non double buffered) operation. However, you can increase the size of your buffer without affecting the period of your acquisition. A buffer of 60 is quite small and, as such, will be more prone to overflow errors. The rate is actually set through the DAQ_Rate() and DAQ_Start() functions. For more information on these functions and how to configure the scan rate, please see the NI-DAQ Function Reference Manual.
NI-DAQ Function Reference Manual for PC Compatibles
http://digital.ni.com/manuals.nsf/websearch/1630A0B68738B269862567C1007A2912?OpenDocument&node=132100_US
A good place to start would be the example titled, "DAQdoubleBuf.c" which ships with the NI-DAQ driver. If you installed the examples for Visual C++ when you installed the NI-DAQ driver you should be able to find this example in the \Program Files\National Instruments\NI-DAQ\Examples\VisualC\AI folder on your computer. This example would be a good template as it is very close to what you are trying to do.
If you observe that you only receive the overflow error when you are operating the two threads, thus ruling out the buffer size as being a potential problem, you may want to examine whether or not your second thread is placing a lengthy exclusion on your data buffer during the period when your first thread is trying to move the data. If your first thread has to wait during the half-buffer transfer this could easily cause the overflow, as the acquisition would be running but the transfer would be paused. Instead of placing a mutual exclusion around one piece of global memory you could try using a queue instead. A queue approach will allow you to pass the data from the first thread into a queue to be read, when convenient, by the second thread. In this method the first thread would never have to wait as the transfer would just be a handoff.
Regards,
Justin Britten
Applications Engineer
National Instruments -
0 bytes at serial port after Visa Write
Hi,
I'm having problems communicating with a Pollux box controlling a stepper motor (both from Micos). The Pollux box has an RS232/485 connection to the computer.
I have tried adaptations of LV's Basic Serial Read and Write example. Even for the basic example there has never been any bytes at the serial port after the write.
I have attached some sample code for LV 10.0.1(64bit) and the OS is Windows Server Enterprise 2008.
The Visa drivers have just been installed.
After some research I have added a 'Set I/O buffer size' as advised by http://digital.ni.com/public.nsf/allkb/60DDFED7EFEFE7188625705700750821?OpenDocument
The time-out is set to 10s, I have a wait of 1s before read and 0.5s between each write (the characters are written individually incase that was the problem).
The write command getaxisno_ should reply with the default axis no which is 1. However, there is never any reply.
The termination character for Venus2 is a space for transmitting commands and ASCII CR LF at the end of received data.
I'm not sure what else could be wrong. According to MAX the device is working properly. Although, when I try to open a Visa test panel in MAX the program crashes. I'm not sure if this is a related problem.
I'd be really grateful for any advice, have been trying to fix this for a few days now.
Thanks in advance!
Ciara
Attachments:
Getaxisno test.vi 18 KBThanks, I'll search those now.
When I click the test panel button, the Max window disappears and the program is closed. Next time I open it an Unexpected Error box opens with a message saying there was an unexpected error and I should search Info Code MAXKnownException.
'The exception occurred in the NIMax process in the function (Unknown).'
I have searched this and the info advised me to send a report with log files etc to NI which I have done. Just waiting on the reply.
I copied the Visa resource name from MAX and the termination character is the same as what a previous owner of the equipment used in Visual Basic. -
Hi,
I'm testing some application using javax.comm.* serial communication package.
Problem some data is missing after some time connection, any one have any clue?
Below is the code snippet.
====================
Open Connection
=============
public void openConnection() throws SerialConnectionException {
// Obtain a CommPortIdentifier object for the port you want to open.
try {
portId = CommPortIdentifier.getPortIdentifier(parameters
.getPortName());
} catch (NoSuchPortException e) {
throw new SerialConnectionException(e.getMessage());
// Open the port represented by the CommPortIdentifier object. Give
// the open call a relatively long timeout of 30 seconds to allow
// a different application to reliquish the port if the user
// wants to.
try {
sPort = (SerialPort) portId.open("SerialDemo", 30000);
} catch (PortInUseException e) {
throw new SerialConnectionException(e.getMessage());
// Set the parameters of the connection. If they won't set, close the
// port before throwing an exception.
try {
setConnectionParameters();
} catch (SerialConnectionException e) {
sPort.close();
throw e;
// Open the input and output streams for the connection. If they won't
// open, close the port before throwing an exception.
try {
sPort.setInputBufferSize(999999999);
os = sPort.getOutputStream();
is = sPort.getInputStream();
dis = new DataInputStream(is);
} catch (IOException e) {
sPort.close();
throw new SerialConnectionException("Error opening i/o streams");
// Create a new KeyHandler to respond to key strokes in the
// messageAreaOut. Add the KeyHandler as a keyListener to the
// messageAreaOut.
keyHandler = new KeyHandler(os);
messageAreaOut.addKeyListener(keyHandler);
// Add this object as an event listener for the serial port.
try {
sPort.addEventListener(this);
} catch (TooManyListenersException e) {
sPort.close();
throw new SerialConnectionException("too many listeners added");
// Set notifyOnDataAvailable to true to allow event driven input.
sPort.notifyOnDataAvailable(true);
// Set notifyOnBreakInterrup to allow event driven break handling.
sPort.notifyOnBreakInterrupt(true);
// Set receive timeout to allow breaking out of polling loop during
// input handling.
try {
sPort.enableReceiveTimeout(30);
} catch (UnsupportedCommOperationException e) {
// Add ownership listener to allow ownership event handling.
portId.addPortOwnershipListener(this);Placing a delay is not the solution.
Have a look at the code snippet that I posted here:
http://forums.ni.com/t5/LabVIEW/Reading-time-interval-of-serial-port/m-p/1529140#M568806
The modified code is also attached in that post.
The solution is to place the serial read inside a loop which continues to read until there is no more data in the buffer.
Maybe you are looking for
-
I have a problem with my ipod video gen 3(classic) I try over and over again to turn it on, try charging it and it does nothing. It just display a skull. What can it be?
-
I recently updated my iTunes to the new Photo application on my Mac. I have downloaded some new photos into Photo but they are not showing up in my iTunes library so that I can download them on my iPhone.
-
Hi I have the issue with delivery in STO. Have created STO order with 3 line items, delivery use to create automatically for STO's (Plant to plant with prject as account assignment category). For all 3 line items system should create only one deliver
-
Photoshop CC 2014. Pattern overlay preview window has schrinked
Strange issue here. The preview window in the layer panel for pattern overlay has schrinked down to just show one pattern. Can't scroll. Can't resize. Can't use patterns that is. The same thing is happening to the preview window in the gradients pane
-
PM order: partner functions - automatically create additional partner
Hello colleagues, if a person responsible is assigned at the order header a role "Technician" with the same ID should be added as partner automatically. How can I solve this? Which user exits could I use? Thanks and best regards, Markus