Search code examples
c#ioserial-port

C# serial connection not working


I am trying to send ASCII caracters to a VideoJet Excel 170i printer, via a RS-232 cable (Serial)

When I am using the test program, i have no problem getting a response from the printer, i can change the status of the printer.

This is the code i've made

 public partial class Form1 : Form
{
    private SerialPort port = new SerialPort("COM1");
    private delegate void SetTextDeleg(string data);

    public Form1()
    {
        InitializeComponent();
    }

    private void addtoText(string text)
    {
        this.richTextBox1.Text = this.richTextBox1.Text + "\n" + text;
    }
    private void Form1_Load(object sender, EventArgs e)
    {
        try
        {
            port.BaudRate = 9600;
            port.Parity = Parity.None;
            port.StopBits = StopBits.One;
            port.DataBits = 8;
            port.Handshake = Handshake.None;
            port.ReadTimeout = 2000;
            port.WriteTimeout = 500;

            port.DtrEnable = true;
            port.RtsEnable = true;

            port.Open();

            port.DataReceived += DataReceivedHandler;

            addtoText("Port is ready");
        }
        catch (Exception ex)
        {
            //Console.WriteLine("Error opening my port: {0}", ex.Message);
            addtoText("Error opening my port: {0}" + ex.Message);
        }
    }

    public void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
    {
        SerialPort sp = (SerialPort)sender;
        System.Threading.Thread.Sleep(500);
        string indata = sp.ReadExisting();
        this.BeginInvoke(new SetTextDeleg(DisplayToUI), new object[] { indata });
    }

    private void DisplayToUI(string displayData)
    {
        addtoText(displayData);

    }


    private void button1_Click(object sender, EventArgs e)
    {
        port.Write(tbxAscii.Text);
    }

    private void Form1_Leave(object sender, EventArgs e)
    {
        port.Close();
    }
}

I need to sent ASCII caracters to the printer, like

[1B][01][09]

To turn the printer to Print Mode.

The printer is supposed to respond, i get no response, and the printer doesn't change its status.

I have a program made to test the serial connection made by the printer, and i can see that all the settings are OK (Baud rate, Parity... port), and indeed on port COM1.

So i think that my port.write is not sending any info to the printer... or maybe i'm sending corrup info and i'm not reading the response of the printer.


Solution

  • are you sure that you want to send [1B][01][09] or do you want to send that byte sequence 0x1b,0x01,0x09

    just to see if this works, send the following in you click handler

    private void button1_Click(object sender, EventArgs e)
    {
        var bytes = new byte[] { 0x1b, 0x01, 0x09 };
        port.Write(bytes, 0, bytes.Length);
        port.Flush(); // make sure everything is written
    }
    

    reading has to be changed, to handle bytes

    SerialPort sp = (SerialPort)sender;
    System.Threading.Thread.Sleep(500);
    
    var available = sp.BytesToRead; // check how many bytes are ready to be read
    if (available < 1)
        return;
    
    var buffer = new byte[available];
    sp.Read(buffer, 0, available);
    
    var indata = BitConverter.ToString(buffer); // convert bytes to a hex representation
    
    this.BeginInvoke(new SetTextDeleg(DisplayToUI), new object[] { indata });