First line from serial port, partial or junk data
I'm trying to receive the following protocol which works, except I have to insert the equipment while the serial port is sending data. So sometimes the first line is partial data and that causes errors down the line. My thought was to wait to receive data until I receive the &&\r\n0108. Any suggestion or code to implement that would be great.
Here is a couple of sample packets:
&&\r\n
0108136.19\r\n
0110146.19\r\n
01130.35\r\n
012350.00\r\n
!!\r\n
&&\r\n
2350155.19\r\n
!!\r\n
TIA,
Jerry
Attachments:
Read_and_Parse_Data.vi 22 KB
Strip_data.vi 12 KB
Hey Raptor50,
I would recommend using a queue to take in the data and then build an array and then trigger some event to start off of the &&/r/n0108 after this line is found you can proceed normally withou any lose of data.
These may help:
http://decibel.ni.com/content/docs/DOC-15453
http://decibel.ni.com/content/docs/DOC-8653
Sam S
Applications Engineer
National Instruments
Similar Messages
-
Reading CTS or DSR lines of Serial port
Is there a way to read the status of CTS or DSR lines of a serial port?
Also in what pins are these lines on standard PC?
Ori Idan
Helicon technologies LTD. National Instruments Alliance member in ISRAEL
Email: [email protected]
Home page: http://www.helicontech.co.il
Tel: +972-6-6262353 Fax: +972-6-6262405
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Things should be made as simple as possible but not simpler
Albert Einstein
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++On Thu, 04 May 2000 16:47:40 +0300, Ori Idan wrote:
>Is there a way to read the status of CTS or DSR lines of a serial port?
>Also in what pins are these lines on standard PC?
While looking for info on printing I found the following:
How can I control the DTR and RTS serial lines?
Serial Port Init.vi can be used to configure the serial port for
hardware handshaking; however, some applications may require manual
toggling of the DTR and RTS lines. Because the interface to the
serial ports is platform-dependent, each platform has a separate
mechanism to control the lines.
(Windows) The LavVIEW for Windows distribution contains a VI which you
can use to drive the DTR and RTS serial lines. The VI serial line
ctrl.vi, located in vi.lib\Instr\_sers
up.llb, can be used to control
these lines. The VI will toggle these lines according to the function
input. Valid codes for the input are:
0 noop
1 clear DTR
2 set DTR
3 clear RTS
4 set RTS
5 set DTR protocol
6 clr DTR protocol
7 noop2
(Macintosh) ..................
(Sun).............................
From LabVIEW User Manual page B-13
Hope this helps.
Regards,
Steve Drake -
How to display raw, not ascii, bytes from serial port?
Hello, I have an instrument that outputs raw data, not ascii, bytes to a serial port. How do you display raw data, not ascii, bytes from a serial port? Since raw data bytes are not displayable, there is got to be something in labview to interpret/display the received bytes the way it is as data in HEX or Binary. The STRING-TO-HEX and STRING-TO-BINARY functions are not applicable in this case because the bytes were not string type in the first place. For example, if the receive byte is 0x4D, I need to display 4D in HEX or 77 in Decimal and not the ascii character "M" corresponding to 0x4D ascii code. I am using a VISA-RD function currently to receive the data from a COM port. VISA-RD outputs string type. Thank for any feedback or suggestion in advance.
BC@Baxter wrote:
...The STRING-TO-HEX and STRING-TO-BINARY functions are not applicable in this case because the bytes were not string type in the first place...
Of course they are string type, just not formatted in a human readable form. So, YES, these functions are not appropriate.
BC@Baxter wrote:
For example, if the receive byte is 0x4D, I need to display 4D in HEX or 77 in Decimal and not the ascii character "M" corresponding to 0x4D ascii code.
Dennis is right, but there is no "decimal" display for strings, so the second requirement needs a tiny little bit more code.
If you have a single byte string, you can typecast it into a U8 number and set the display format as decimal, hex, octal, or binary as desired. In decimal, it would display the number 77. Since it is now a numeric, you can even do math with it.
In general, the string has multiple bytes, and you would typecast it into an array of U8 numbers (Since this is an often used function, there is also a "string to byte array" which does the same thing).
Typecasting is the secret. You can e.g. easily typecast 2 bytes into a U16, 4 bytes into a I32, 8 bytes into a DBL, etc. For more detailed requirements, there is also the "unflatten from string". Check the online help for details. Good luck!
LabVIEW Champion . Do more with less code and in less time . -
Problem while reading data from Serial Port
Hi All,
I am facing some problem while reading data from Serial Port.
As per the requirement I am writing the data on Serial Port and waiting for response of that data.
Notification for data availabilty is checked with method public void serialEvent(SerialPortEvent event) of javax.comm.SerialPortEventListener.
When we are writing data on the port one thread i.e. "main" thread is generated and when data availability event occures another thread "Win32SerialPort Notification thread" is generated. This creates problem for me as we can't control thread processing.
So can anybody pls explain me how to overcome this problem?
Regards,
NehaMy Problem is:-
I am simoultaneouly wrting data on port & reading data from port.
First I write data on port using outputStream.write() method. Now when target side sends me response back for the request on serial port DATA_AVAILABLE of SerialPortEventListner event occured,we are reading data from serial port.Now till the time we didn't get the response from target next command can't be written on the serial port. When we are writing data on port main thread is executed.Now my problem starts when DATA_AVAILABLE event occured.At this point another thread is created.Due to this my program writes data of next command without reading response of previous command.To solve this prob. I have used wait() & notify() methods as follows.But again due to this my pc hangs after execution of 2 commands. (PC hang in while loop in a code provided below.)
From SOPs I could figure it out that after 2 commands we are not able to write data on serial port so DATA_AVAILABLE event doesn't occure n pro. goes in wait state.
Can anybody help me to solve this issue.
Neha.
Code:
public void serialEvent(SerialPortEvent event)
switch (event.getEventType())
case SerialPortEvent.BI:
case SerialPortEvent.OE:
case SerialPortEvent.FE:
case SerialPortEvent.PE:
case SerialPortEvent.CD:
case SerialPortEvent.CTS:
case SerialPortEvent.DSR:
case SerialPortEvent.RI:
case SerialPortEvent.OUTPUT_BUFFER_EMPTY:
break;
case SerialPortEvent.DATA_AVAILABLE:
try
dataThread = Thread.currentThread();
dataThread.setPriority(10);
dataAvailable = true;
byte[] tempArray=new byte[availableBytes];
inputStream.read(tempArray);
catch (IOException io)
SOP(io, "Error in serialEvent callback call for event DATA_AVAILABLE");
public void writetoPort(byte[] data) throws IOException
outputStream.write(data);
while(finalTimeOut >= actualTime)
if( ! dataAvailable)
actualTime = System.currentTimeMillis();
else
synchronized (mainThread)
mainThread = Thread.currentThread();
mainThread.wait();
public void sendDatatoUser(byte[] b) throws Exception, HWCCSystemFailure
obj.returnData(b);
synchronized(mainThread)
mainThread.notify();
-
Unable to capture data from Serial port using LVRT2010 in single core pentium 4 machine
I am using application written in Labview using windows Labview
Runtime environment 2010. Application creates a tunnel to intercept data from
Serial port.
My problem is, Currently, I am using single core Pentium
processor. When I am trying to intercept the data between COM1 and COM7 (COM 7
is a virtual port) it is not able to capture data.
When I am running Labview RT environment using dual core
processor machine it is running normally. I wonder whether it could be the compatibility issues with
single core Pentium processor.Hi Magnetica
Are both of the machines running the same runtime engine,
drivers ect?
Have you had RT applications running on this
machine before?
Is the development computer a 64bit machine?
The processor is a supported model (See link below).
http://zone.ni.com/devzone/cda/tut/p/id/8239
Regards
Robert
National Instruments UK & Ireland -
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. -
How to save a datas from serial port?
How to save a datas from serial port?
Hi
I need some help about rs-232 communication. I want to make a vi witch can do this things:
-read a txt file (to simulate a serial port like when the datas are coming)
i will get 3 different data in serial port (like this: 121 213 135)
i want to save in a txt file what datas get my vi
so
-write in a txt file or draw in a diagram (or both)
so my problem is: read in serial port and save in a file and draw a diagram.
if anybody can help pls HELP ME because im a beginner in this problem.
I already do something but Im not sure that good.
Thx for all. -
Read data from serial port or TCP port of frontend PC
Hello Friends,
I have requirement to read data from device connected to frontend PC which will provide meter reading data.
Vendor has given me two option.
1. Device can be connected to seiral port and data transfer will be done through MODBUS RTU protocol.In that case data need to capture from serial port.
2. Device can be connected to TCP port and Socket program can be provided for data transfer. In that case SAP will act as client and communicate with TCP port.
There will be multiple workstation with individual meters connected to them.
I am aware of text file interfacing through front end tools using custom code using VB,JAVA or others.
Is there any solution availble to achieve above things using ABAP other than text file , like direct communication?
I am using ECC 6.0.Hello,
Socket programming in not available on ABAP, but you may use RFC for the same.
Use the below links for more details
[Link 1|http://help.sap.com/printdocu/core/print46c/en/data/pdf/BCFESDE2/BCFESDE2.pdf]
[Link 2|http://forums.sdn.sap.com/thread.jspa?threadID=1820233]
Regards,
Abhishek -
Reading a char array from Serial port
Need help!
Hi, I've got the following problem - I wanna read a input stream from serial port and I use at the moment the following method (reading bytewise):
public String receiveText (){
byte ch;
fStrBuf.delete(0,fStrBuf.length()); //clearing the buffer
try{
do {
ch = (byte) fPortInStream.read();
fStrBuf.append( (char) ch);
while ( (byte) ch != 0x03); //The end of frame byte
}catch(IOException ioe) {};
return fStrBuf.toString();It works pretty well, but disadvantage is that it's too slow to use it in the thread (at least I think so)
How can I change it to read all available data from the port (or simply faste). I don't need event listeners, because it's a request-responde communication.
I tried smth. like this
byte[] readBuffer = new byte[20];
try {
while (fPortInStream.available() > 0) {
int numBytes = inputStream.read(readBuffer);
fStrBuf.append(readBuffer);
} catch (IOException e) {}
return fStrBuf.toString();But it doesn't seem to work :-(May I suggest that you use StringBuilder rather than StringBuffer. It has less overhead because it is not threadsafe. I do synchronous serial port stuff with Opto 22, and i have no listeners enabled.
Appending to the String(Builder/Buffer) directly from the byte buffer mangles it. So I use a string (ugh). With the Opto22 brain boards, i am looking for a carriage return as a term char. It either finds it or times out.
This is the best i have come up with so far:
StringBuilder response = new StringBuilder();
String data = new String();
long msTimeOut = 2000;
public void getResponse () throws IOException {
byte[] readBuff = {0};
int charAvail;
response.delete(0,response.length());
long ts = Calendar.getInstance().getTimeInMillis();
try {
while ( readBuff[readBuff.length-1] != '\r' ) {
charAvail = inputStream.available();
if ( charAvail > 0 ) {
readBuff = new byte[charAvail];
inputStream.read(readBuff);
response.append(new String(readBuff));
if ( Calendar.getInstance().getTimeInMillis() > (ts + msTimeOut) ) {
response.delete(0,response.length());
response.append("TIMEOUT");
break;
} catch (IOException e) { e.printStackTrace(); throw e; }
data = response.substring(0);
} I just starting writing Java about 4 days ago, so caveat emptor. -
Count time between 2 readings from serial port... help!.
Hi guys,
I am using my application to get the readings sent by microcontroller from serial port. It works perfectly. But i have the problem, the pic uses 16bits counter, and sometimes i measure frequency lower than 15hz (65535-->16bits). Thats why I thought to measure the time between each pulse that it recieved in serial port. So i could multiply the reading about the time which spend in arrive to serial port. I know if any pulse spend more than 15hz, i should add 65535 to this reading.
Then, the idea is count the time spent between each reading in serial port. SInce pics count and later send each turn.
I dont know if it is possible, and exist any easy way.. Can ayone help me?.
I would like to see any example of it, always it is possible.
Regards, Fonsi.
Attachments:
capture.GIF 19 KBYou're not going to be able to get even close to 1 usec resolution using the built-in time functions though I don't see any of those in your attachment. The windows clock is simply not that accurate. If you need to precisely time your serial reads you might want to look at using the timed loop. You can set the period of that to 1 msec.
-
Need help with java File IO ( Removing the first line from a file )
Hi guys ,
I am currently doing a project in which I need to extract out the values from the second line of a file to the end. The question is how do I ignore the first line ??
I thought of two possible answers myself. One is to use randomaccessfile to read and rewrite. But the file may be HUGE so storing the whole file in memory is not a very good idea.
Second is to jump to second line before doing while ((str = in.readLine()) != EOL) ... or just delete the first line from the file. Can anyone suggest a better solution or show me some sample codes ? Thanks.
regards
billyamJust skip the first line (bufferedReader.readLine()), add a comment, and then handle the rest of your file
-
Parsing data from Serial Port one byte at a time
Hi everyone,
What I want to do is read in from the serial port byte by byte and parse each byte that I am reading in. The size of the data read in varies. How do I do that? I can do using .dll but I want to learn how to do it in labview. I searched through the forum for something similar but no luck. I have seen some that puts the VISA read in a while loop and others that puts the property node, "bytes at Port" in a while loop. What is the difference in doing either way? I am using Labview 7.1 Can anyone point me in the right direction?
ThanksHi guys..
I'm still a beginner in using labview tcp/ip function. for now, i have a project to read the labview data with java programming language so that i can monitor that data using any devices that using java, such as PC or cell phone. my task for now is to determine the format of data that being sent (its type, length, etc), coz as far as i done until now, the data that read in the java is still a raw material so that i dont know how to gain the information from that data.
my question is :
- how does the type cast work in changing the data format from one to another?
- how does the bytes to read in tcp read work? coz when i'm changing the length of bytes to read constant from 4 bytes to another, the data is becoming mess up. As far as i know, the bytes to read only read the first "constant number" byte in the tcp read to determine the length and type of the data..
thanks -
Java bean to get information from serial port
we are migrating from 6i to 10g. In 6i, we used mscomm32.ocx to access to com port. Now in 10g we need a java bean. Anybody has a java bean to access to serial port or anything similar?
My email is [email protected]
Thanks in advance.we set properties to the serial port, open the port, read (listen) from port, ... Here there are some pieces of code to you see it:
-- Si está abierto el puerto puedo leer
IF (MsCommLib_ImsComm.PortOpen(:ITEM('IF_OCX_COM').INTERFACE)=-1) THEN
-- Miro si hay caracteres
a:=MsCommLib_ImsComm.InBufferCount(:ITEM('IF_OCX_COM').INTERFACE);
IF a>0 THEN
set_item_property('COMUNICACION_ICS.ESPERA',DISPLAYED,PROPERTY_FALSE);
--Datos de un bloque nuevo, hay que insertar la fecha
IF :global.estado = 0 THEN
--Leo la fecha en la que se ha leído los datos
--SELECT SYSDATE INTO fecha
--FROM DUAL;
fecha := To_Date(:System.Current_Datetime,'dd-mon-yyyy hh24:mi:ss');
-- Borro la pantalla si hay mas de 1920 caracteres
:global.tc := :global.tc + 21;
IF :global.tc > 1920 then
:comunicacion_ics.if_txt_com_rec :='';
:global.tc := 0;
end if;
--Introduzco la fecha en el control de texto, para su posterior proceso
:comunicacion_ics.if_txt_com_rec := :comunicacion_ics.if_txt_com_rec||CHR(10)
||'__' || To_Char(fecha,'DD-MM-YYYY,HH24:Mi:SS')||chr(10);
guarda := Fichero.Escribe(:global.fic,CHR(10)||'__' || To_Char(fecha,'DD-MM-YYYY,HH24:Mi:SS')
||chr(10));
if guarda < 0 then
raise e;
end if;
END IF;
-- Indico que se están recibiendo datos de este bloque
:global.estado := 2;
--Leo la cadena
linea_ics := Var_To_Char(MsCommLib_ImsComm.Input(:item('IF_OCX_COM').INTERFACE));
linea_ics := replace(linea_ics,chr(13),CHR(10)); -- CHR(10)
--La añado al control de texto para que se vea
-- Borro la pantalla si hay mas de 1920 caracteres
:global.tc := :global.tc + a;
IF :global.tc > 1920 then
:comunicacion_ics.if_txt_com_rec :='';
:global.tc := 0;
end if;
:comunicacion_ics.if_txt_com_rec := :comunicacion_ics.if_txt_com_rec||
linea_ics;
--Escribo la linea en el fichero
-- Propiedades de Buffers
-- Tamaño del Buffer de Entrada
:prop_com.txt_in_buf := MsCommLib_ImsComm.InBufferSize(:ITEM('IF_OCX_COM').INTERFACE);
-- Tamaño del Buffer de Salida
:prop_com.txt_out_buf := MsCommLib_ImsComm.OutBufferSize(:ITEM('IF_OCX_COM').INTERFACE);
-- Tamaño de la cadena de Entrada
:prop_com.txt_input_len := MsCommLib_ImsComm.InputLen(:ITEM('IF_OCX_COM').INTERFACE);
-- RThreshold
:prop_com.txt_rthres := MsCommLib_ImsComm.RThreshold(:ITEM('IF_OCX_COM').INTERFACE);
-- SThreshold
:prop_com.txt_sthres := MsCommLib_ImsComm.SThreshold(:ITEM('IF_OCX_COM').INTERFACE);
-- EOF Enable
:prop_com.chk_eof_enable := MsCommLib_ImsComm.EOFEnable(:ITEM('IF_OCX_COM').INTERFACE);
-- Propiedades Hardware
-- Parity replace
:prop_com.txt_par_repl := MsCommLib_ImsComm.ParityReplace(:ITEM('IF_OCX_COM').INTERFACE);
-- NULL Discard
:prop_com.chk_null_discard := MsCommLib_ImsComm.NULLDiscard(:ITEM('IF_OCX_COM').INTERFACE);
-- RTS Enable
:prop_com.chk_rts := MsCommLib_ImsComm.RTSEnable(:ITEM('IF_OCX_COM').INTERFACE);
-- NULL DTR
:prop_com.chk_dtr := MsCommLib_ImsComm.DTREnable(:ITEM('IF_OCX_COM').INTERFACE);
Thanks. Inma -
Controlled reading from serial port
I'm trying to establish a connection to an external device through the serial port. This is done in a while-loop which sends an association request tries to get a response if a response is not recieved a new rewuest is sent, etc. At the moment this procedure does not work. I am considering two explanations for this. The first is that the loop does not wait long enough for a response to come and simply keeps pumping out requests, the other is that there is something wrong with the reading algorithm, that doesn't let it properly take in information from the serial port.
Solved!
Go to Solution.
Attachments:
association_loop.GIF 5 KB
read_visa.GIF 8 KBI made a new version of the read case. The old version was a while loop, the new version is a while loop which will go on until it encounters an EOF character. In this case it is
0xC1 or 'Á'. I thought the old version would break before getting any message. This doesnt get any signal either. I have probed it, and it doesn't get a string from which to take the length.
Attachments:
read_visa2.GIF 10 KB -
I've got no response from serial port
Hi,i found sample source code from this forum to make communication to modem. I tried that code to make communication to cellular phone which is connected to serial port by data cable. There is no response at all from the phone. I'm confused, what's wrong with the code? But if i use hyper terminal on windows 2000 to send AT commands,the phone gives responds. FYI,i use Siemens C35i cellular phone. Is there someone who can tell me what's wrong with the code ?
Thank's very much
Here is the code :
import java.io.*;
import java.util.*;
import javax.comm.*;
public class Coba11 implements SerialPortEventListener {
static CommPortIdentifier portId;
Enumeration portList;
DataInputStream inputStream;
DataOutputStream outputStream;
SerialPort serialPort;
public static void main(String[] args) {
boolean portFound = false;
String defaultPort = "COM1";
Coba11 cb = new Coba11();
cb.portList = CommPortIdentifier.getPortIdentifiers();
while (cb.portList.hasMoreElements()) {
System.out.println("Masuk ke dalam while");
cb.portId = (CommPortIdentifier) cb.portList.nextElement();
if (cb.portId.getPortType() == CommPortIdentifier.PORT_SERIAL) {
if (cb.portId.getName().equals("COM1")) {
System.out.println("Found port: "+defaultPort);
portFound = true;
try {
cb.serialPort = (SerialPort) cb.portId.open("SimpleReadApp", 2000);
} catch (PortInUseException e) {}
//get inputstream and outputstream from the port
try {
cb.inputStream = new DataInputStream(cb.serialPort.getInputStream());
cb.outputStream = new DataOutputStream(cb.serialPort.getOutputStream());
} catch (IOException e) {}
try {
cb.serialPort.addEventListener(cb);
} catch (TooManyListenersException e) {}
cb.serialPort.notifyOnCTS(true);
cb.serialPort.notifyOnDSR(true);
cb.serialPort.notifyOnRingIndicator(true);
cb.serialPort.notifyOnCarrierDetect(true);
cb.serialPort.notifyOnOverrunError(true);
cb.serialPort.notifyOnParityError(true);
cb.serialPort.notifyOnFramingError(true);
cb.serialPort.notifyOnBreakInterrupt(true);
cb.serialPort.notifyOnDataAvailable(true);
try {
cb.serialPort.setSerialPortParams(19200, SerialPort.DATABITS_7,SerialPort.STOPBITS_1,SerialPort.PARITY_NONE);
} catch (UnsupportedCommOperationException e) {}
//send commands to the cellular phone
String atCommand = "ATD08128533615";
try {
cb.outputStream.write(atCommand.getBytes());
atCommand = "AT";
Thread.sleep(1000);
cb.outputStream.write(atCommand.getBytes());
} catch (IOException e) {}
catch (InterruptedException e) {}
try {
Thread.sleep(40000);
atCommand = "AT";
cb.outputStream.write(atCommand.getBytes());
Thread.sleep(500);
} catch (InterruptedException e) {}
catch (IOException e) {}
try {
cb.inputStream.close();
cb.outputStream.close();
} catch (IOException e) {}
cb.serialPort.close();
System.out.println("Serial Port is closed");
if (!portFound) {
System.out.println("port " + defaultPort + " not found.");
public void serialEvent(SerialPortEvent event) {
switch (event.getEventType()) {
case SerialPortEvent.DATA_AVAILABLE:
byte[] readBuffer = new byte[20];
try {
int numBytes = inputStream.read(readBuffer);
String string = new String(readBuffer);
System.out.print(string);
} catch (IOException e) {}
break;the very first command you have to send to the modem is AT
wait 2 seconds then start sendind other commands
Maybe you are looking for
-
Why will iphone not show up in itunes
My iphone doesn't show up in tunes. It shows up on the computer but wont show up in itunes. Does anybody know how to fix this.
-
Parent Child Value Sets for Item Categories
I've tried to set up parent-child value sets, not independent-dependent sets for Item Categories but in vain. So, if Item Category has 2 segments - Category & Sub-Category; Sub-Category only shows valid values for a category. For example, if Category
-
Powerbook g3 walstreet 12.1 display need help!!!
hello, i just bought my first mac off ebay, its a wallstreet with 12.1 display, just that the screen is craked it powers up and everything but i need to replace the screen itself, i just got a 12.1 screen off ebay just the screen itself not the whole
-
Session context getting expired
Hi, I am making a call from my application to other application.I am setting the session ctx in my application . In my application i have a stateless session bean .If i do mySessionCtx.getCallerPrincipal().getName()); lets say I am getting xyz. My be
-
Why is my iPod touch 4g wifi grayed out?
I just updated my iPod to the ios6, and my wifi wasn't working. I have rebooted my ipod, restarted it, turned off and back on, reset the network settings, reset system settings, and none of those have brought the wifi switch out of the gray area. I h