c# - Best way to return value from serial port within a library -



c# - Best way to return value from serial port within a library -

i trying send , receive info serial port, , can info datareceived event normally. now, create library, developed send , receive info serial port. don't know how send command , retrieve value 2 different methods. makes me confused, help me, please!

static void main(string[] args) { fxreader reader = new fxreader(); reader.comport = port; reader.connect(); console.writeline(reader.setportpower(1)); console.readline(); console.writeline(reader.getportstatus(1)); console.readline(); } public class fxreader : idisposable { private serialport rs232 = null; public string comport { { homecoming rs232.portname; } set { rs232.portname = value; } } public bool isconnected { { homecoming rs232.isopen; } } public f520reader() { rs232 = new serialport(); rs232.baudrate = 115200; rs232.parity = parity.none; rs232.databits = 8; rs232.stopbits = stopbits.one; rs232.datareceived += new serialdatareceivedeventhandler(rs232_datareceived); } public void connect() { rs232.open(); } public void disconnect() { rs232.close(); } public int getportpower(int port) { if (rs232.isopen) { byte[] command = { 0x5a, 0x00, 0x19, 0x00, 0x01, 0xff, 0xff, 0x7e }; rs232.write(command, 0, command.length); //how can value event of "rs232_datareceived" homecoming powervalue; } } public int getportstatus(int port) { if (rs232.isopen) { byte[] command = { 0x5a, 0x00, 0x19, 0x00, 0x01, 0xff, 0xff, 0x7e }; rs232.write(command, 0, command.length); //how can value event of "rs232_datareceived" homecoming statusvalue; } } void rs232_datareceived(object sender, serialdatareceivedeventargs e) { system.threading.thread.sleep(50); if (rs232.bytestoread > 0) { byte[] recvbuffer = new byte[1024]; int recvlength = rs232.read(recvbuffer, 0, recvbuffer.length); array.resize(ref recvbuffer, recvlength); pharseresponse(recvbuffer); } } private void pharseresponse(byte[] buffer) { if (buffer[0] == 0x5a && buffer[buffer.length - 1] == 0x7e) { #region response port powerfulness if (buffer[1] == 0x01 && buffer[2] == 0x13) { //how can homecoming value method of "getportpower" homecoming buffer[7]; } #endregion #region response port status if (buffer[1] == 0x01 && buffer[2] == 0x14) { //how can homecoming value method of "getportstatus" homecoming buffer[7]; } #endregion } } #region idisposable members public void dispose() { if (rs232.isopen) rs232.close(); rs232.dispose(); } #endregion }

this not "best way". not getting benefit whatsoever using datareceived event. useful in event-driven application, gui app example. not in app must response before can proceed in program.

so don't utilize @ all, phone call read() method straight instead. programme block until device sends back.

which help write right code, not right right now. reading serial port produces 1 or 2 bytes. homecoming value of read() tells how many got. cannot parse response until got complete one. isn't obvious current code "complete" looks like, need have received @ to the lowest degree 8 bytes before pharseresponse() method stop crashing indexoutofrangeexception. serial protocol uses specific byte value indicate end of response.

c# .net dll serial-port

Comments

Popular posts from this blog

java - How to set log4j.defaultInitOverride property to false in jboss server 6 -

c - GStreamer 1.0 1.4.5 RTSP Example Server sends 503 Service unavailable -

Using ajax with sonata admin list view pagination -