How to open RJ11 cash drawer in c# - c#

I have a cash drawer (Model = PSHOP CD4141) and POS PC (Posbank Apexa G). I can open cash drawer via XPrinter Q900 after or before printing receipt (there is an option in printer settings). But i need to open drawer without printer. There are RJ11 ports on the POS PC. I tried this code:
using System;
using System.Collections.Generic;
using System.Text;
using Microsoft.PointOfService;
namespace POS
{
public class CashDrawerClass
{
CashDrawer myCashDrawer;
PosExplorer explorer;
public CashDrawerClass()
{
explorer = new PosExplorer(this);
DeviceInfo ObjDevicesInfo = explorer.GetDevice("CashDrawer");
myCashDrawer = explorer.CreateInstance(ObjDevicesInfo);
}
public void OpenCashDrawer()
{
myCashDrawer.Open();
myCashDrawer.Claim(1000);
myCashDrawer.DeviceEnabled = true;
myCashDrawer.OpenDrawer();
myCashDrawer.DeviceEnabled = false;
myCashDrawer.Release();
myCashDrawer.Close();
}
}
}
But it doesn't work. Can anyone suggest how can i open cash drawer without printer?

I found the answer. As #kunif said, Apexa G comminucates with cash drawer on COM5 port. All i need simple Write() command. Following code works:
string port = "COM5";
using (SerialPort serialPort = new SerialPort(port))
{
serialPort.Close();
serialPort.Open();
serialPort.Write("\x001B#\x001Bp\0.}");
serialPort.Close();
}

Related

Best practice for reading serial port in Unity3D version 2020.3.30f1?

I have a MCU that is sending data to serial port. I want Unity3D to read the data. So far, nothing I have found works and I'm looking for some help on getting Unity to read the serial port.
Expected behavior is for the serial data to be saved to a string in order to perform operations with the data contained.
At the moment, when I run the Unity editor everything is fine until I actually try to read the serial port. As soon as an attempt is made to read the serial port the Unity editor totally freezes. There are no error logs, no console errors within the editor (since it is frozen), and the editor does not respond to my inputs (clicks, scrolls, etc.).
The solution at this point is to open the task manager and end the task for the Unity editor.
My current implementation is utilizing threads, however, I'm looking for the best practice to read serial port. Perhaps coroutines? Anyway, here's what I have so far.
using System.Collections;
using System.Collections.Generic;
using System.Threading;
using System.IO.Ports;
using UnityEngine;
public class Arduino_Read_Serial : MonoBehaviour
{
[Header("Settings")]
[SerializeField] private bool enableReadThread = false;
private SerialPort data_stream = new SerialPort("COM6", 115200);
[SerializeField] private string receivedString;
private Thread readThread;
void Start()
{
data_stream.WriteTimeout = 300;
data_stream.ReadTimeout = 5000;
data_stream.DtrEnable = true;
data_stream.RtsEnable = true;
data_stream.Open();
if (data_stream.IsOpen)
{
readThread = new Thread(ReadThread);
}
}
void Update()
{
if (enableReadThread && data_stream.IsOpen)
{
readThread.Start();
enableReadThread = false;
}
else
{
Debug.Log("Pulse...");
}
if (receivedString != "")
{
//readThread.
}
//string[] datas = receivedString.Split(',');
//Debug.Log(datas);
}
void ReadThread()
{
while (data_stream.IsOpen)
{
receivedString = data_stream.ReadLine();
}
}
public void OnApplicationQuit()
{
Debug.Log("Thread stopped...");
readThread.Abort();
}
}
Any insight on some best practices for reading the serial port in Unity would be supremely appreciated.
These are the answers I attempted to use but none of them are working:
[1] Unity Serial.ReadLine() issue
[2] https://answers.unity.com/questions/1696938/arduino-serial-delegate-help.html
[3] https://answers.unity.com/questions/1735855/unity-crashes-when-connecting-to-a-serial-port.html
[4] https://forum.unity.com/threads/cant-use-system-io-ports.141316/
[5] https://www.youtube.com/watch?v=5ElKFY3N1zs

Can't Read Data from external Server to Hololens

I have written some code to transfer data from external server to Hololens. I am able to connect Hololens to the server. But I am facing problem in sending the data from server to Hololens. Whenever I call ReadData function it isn't even connected(it prints Not connected).
I am quite new to c# and unity and isn't able to sort out this matter yet.
I am using StreamSocket and DataReader classes to connect and read the data respectively. Function Connect() connects with the server in start() method and then I call ReadData function in update() method to get the data from the server at every frame. I am attaching my code file.
Can you help me out in solving my problem Thanks in advance.
using System.Collections;
using System.Collections.Generic;
using System.Net.Sockets;
using System.Threading;
using System.Text;
using System.Net;
using System;
using UnityEngine;
#if !UNITY_EDITOR && UNITY_METRO
using Windows.Networking.Sockets;
using Windows.Storage.Streams;
using Windows.Networking;
using Windows.Foundation;
#endif
public class TCPclientRead : MonoBehaviour
{
public string ServerIP = "10.1.2.35";
[Tooltip("The connection port on the machine to use.")]
public int ConnectionPort = 11000;
private string data = "connected" ;
public TextMesh mesh;
private bool connected = false;
#if !UNITY_EDITOR && UNITY_METRO
private StreamSocket networkConnection;
/// <summary>
/// Temporary buffer for the data we are recieving.
/// </summary>
//private byte[] dataBuffer;
public void Connect( )
{
// Setup a connection to the server.
HostName networkHost = new HostName(ServerIP.Trim());
//HostName networkHost = new HostName( IPAddress.Any.ToString());
networkConnection = new StreamSocket();
// Connections are asynchronous.
// !!! NOTE These do not arrive on the main Unity Thread. Most Unity operations will throw in the callback !!!
IAsyncAction outstandingAction = networkConnection.ConnectAsync(networkHost, ConnectionPort.ToString());
AsyncActionCompletedHandler aach = new AsyncActionCompletedHandler(NetworkConnectedHandler);
outstandingAction.Completed = aach;
}
public void NetworkConnectedHandler(IAsyncAction asyncInfo, AsyncStatus status)
{
if (status == AsyncStatus.Completed)
{
connected = true;
// Here Just display connected
}
else
{
connected = false;
Debug.Log("Failed to establish connection. Error Code: " + asyncInfo.ErrorCode);
// In the failure case we'll requeue the data and wait before trying again.
networkConnection.Dispose();
}
}
public void ReadData()
{
if(connected)
{
DataReader reader = new DataReader(networkConnection.InputStream);
reader.InputStreamOptions = InputStreamOptions.Partial;
reader.LoadAsync(512);
data = reader.ReadString(512);
}
}
private void Start()
{
mesh = gameObject.GetComponent<TextMesh>();
Connect();
}
private void Update()
{
if (connected)
{
mesh.text = data;
}
else
mesh.text = "Not Connected";
ReadData();
}
#endif
}
Edit : 1. I have doubt that ReadData() needs to be called asynchronously Therefore I updated the code but it isn't working even now.
2. I am using Unity Editor and I have enabled the required settings and I am able to connect to the server. It's just that I am not able to transfer the data.
3. I am using netcat to create server.
My updated code
delegate void DelegateMethod();
public async void ReadData()
{
if(connected)
{
DataReader reader = new DataReader(networkConnection.InputStream);
reader.InputStreamOptions = InputStreamOptions.Partial;
await reader.LoadAsync(512);
data = reader.ReadString(512);
}
}
public void AsynCall()
{
DelegateMethod dlgt = new DelegateMethod(this.ReadData);
IAsyncResult ar = dlgt.BeginInvoke(null, null);
dlgt.EndInvoke(ar);
}
private void Start()
{
mesh = gameObject.GetComponent<TextMesh>();
Connect();
}
private void Update()
{
if (connected)
{
if(String.IsNullOrEmpty(data))
data = "Improper";
AsynCall();
mesh.text = data;
}
else
mesh.text = "Not Connected";
}
My suspicion is that you have not enabled the UWP Capability "InternetClient" which would prevent it from actually connecting to the remote server. You don't mention what tool chain you are using, but if you are in Unity check under Build Settings -> Publish Settings -> Windows Store -> Publishing Settings -> Capabilities. If you are working in Visual Studio, you can adjust this in the project properties.

How can i scan and list all connected devices to my network wireless, i'm getting exception?

My pc is connected to the router of the network i want to scan but the not wireless the pc is connected with a cable to the router.
But my android device is connected to the network wireless.
So in logic in this case the results in the list should be my pc and my android device.
This is what i'm using now managed wifi api:
managed wifi api
This is my code:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using NativeWifi;
namespace ScanWifi
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
WlanClient client = new WlanClient();
try
{
foreach (WlanClient.WlanInterface wlanIface in client.Interfaces)
{
Wlan.WlanBssEntry[] wlanBssEntries = wlanIface.GetNetworkBssList();
foreach (Wlan.WlanBssEntry network in wlanBssEntries)
{
int rss = network.rssi;
byte[] macAddr = network.dot11Bssid;
string tMac = "";
for (int i = 0; i < macAddr.Length; i++)
{
tMac += macAddr[i].ToString("x2").PadLeft(2, '0').ToUpper();
}
listView1.Items.Add("Found network with SSID {0}." + System.Text.ASCIIEncoding.ASCII.GetString(network.dot11Ssid.SSID).ToString());
listView1.Items.Add("Signal: {0}%."+ network.linkQuality);
listView1.Items.Add("BSS Type: {0}."+ network.dot11BssType);
listView1.Items.Add("MAC: {0}.", tMac);
listView1.Items.Add("RSSID:{0}", rss.ToString());
}
Console.ReadLine();
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
private void Form1_Load(object sender, EventArgs e)
{
}
}
}
When running the program i'm exception on WlanApi.cs on the line:
Wlan.ThrowIfError(
Wlan.WlanOpenHandle(Wlan.WLAN_CLIENT_VERSION_XP_SP2, IntPtr.Zero, out negotiatedVersion, out clientHandle));
System.ComponentModel.Win32Exception' occurred in ManagedWifi.dll
The service has not been started
For Windows 10, the service "WLAN AutoConfig" must be started for WlanClient to work. This service should be started automatically on a computer which has a WiFi adapter present. On a computer such as a desktop which does not have a WiFi adapter, the service startup type is probably Manual and not started; you can start it anyway and WlanClient should no longer throw any exceptions, but without a WiFi adapter, it won't see any interfaces, so you won't be able to get a list of networks.
According to the documentation of the [WlanOpenHandle ][1] function, the problem is that the Wireless Zero Configuration (WZC) service is not started on your machine:
WlanOpenHandle will return an error message if the Wireless Zero Configuration (WZC) service has not been started or if the WZC service is not responsive.
However, depending on your platform, it might also might be the case that you are simply passing the wrong parameters to the WlanOpenHandle function. Have you tried passing Wlan.WLAN_CLIENT_VERSION_LONGHORN as the first parameter?

Get name of bluetooth device on the Devices and Printers window

I know there are questions out there referring to gathering the friendly name of a device on the Device Manager but I cannot do this as the device is simply referred to as "Stardard Serial over Bluetooth link (COM)" and I have many virtual ports with the same reference. I want the name of the device as shown on the Devices and Printers window on:
I'm doing this in C# and currently just getting a list of available COM ports on the system and selecting the one I know from memory.
I managed to get it to work using 32Feet.Net.
You can search for a device by doing
BluetoothClient client = new BluetoothClient();
devices = client.DiscoverDevicesInRange();
foreach (BluetoothDeviceInfo d in devices)
{
items.Add(d.DeviceName);
}
This will give a list of the friendly names you see on the Devices and Printers window rather than "Standard serial over Bluetooth Link".
If you want the COM port like me or any other piece of information then you can simply do a WMI query such as
System.Management.ManagementObjectSearcher Searcher = new System.Management.ManagementObjectSearcher("Select * from WIN32_SerialPort");
foreach (System.Management.ManagementObject Port in Searcher.Get())
{
//your comparison or code here
}
I managed to get the bluetooth name, address and the COM port number without using the 32feet.net library by fiddling with the registry key.
Then, you could connect the bluetooth device by using the SerialPort class by passing the COM port number.
The pseudo code to obtain the bluetooth information is below:
enumerate all the COM port available in the PNP
obtain the device classGuid
search the bluetooth address from the classGuid
when the bluetooth address is known, the bluetooth name can be obtained from - this registry SYSTEM\CurrentControlSet\Services\BTHPORT\Parameters\Devices
I have posted my code in the link below:
https://stackoverflow.com/a/36298213/2297825
I'm using my custom code using 32feet.Net Library which helps me to get the Device Friendly Name also COM port information attached with that device in C# Console Application.
I'm using below code to detect Topaz-Signature Device, and its friendly Name is "T-S460-BT2". You can replace this
string FriendlyDeviceName = "T-S460-BT2";
in the code with your device name you want to search.
using InTheHand.Net;
using InTheHand.Net.Bluetooth;
using InTheHand.Net.Bluetooth.Widcomm;
using InTheHand.Net.Sockets;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Management;
using System.Text;
using System.Text.RegularExpressions;
namespace SearchDevice
{
class Program
{
static void Main(string[] args)
{
string FriendlyDeviceName = "T-S460-BT2";
if (BluetoothRadio.IsSupported)
{
BluetoothClient client = new BluetoothClient();
BluetoothDeviceInfo[] devices;
devices = client.DiscoverDevicesInRange();
foreach (BluetoothDeviceInfo d in devices)
{
if (Regex.IsMatch(d.DeviceName, FriendlyDeviceName, RegexOptions.IgnoreCase))
{
try
{
string query = string.Format("SELECT Name, DeviceID, PNPDeviceID from WIN32_SerialPort");
ManagementObjectSearcher searcher = new ManagementObjectSearcher(query);
ManagementObjectCollection osDetailsCollection = searcher.Get();
foreach (ManagementObject mo in osDetailsCollection)
{
string PNPDeviceID = (string)mo.GetPropertyValue("PNPDeviceID");
if (PNPDeviceID != null && Regex.IsMatch(PNPDeviceID, d.DeviceAddress + "", RegexOptions.IgnoreCase))
{
Console.WriteLine("{0}", ((string)mo.GetPropertyValue("DeviceId")).Replace("COM", ""));
}
}
}
catch (Exception exx)
{
}
}
}
}
else
{
Console.WriteLine("Not Supported");
}
Console.ReadLine();
}
}
}

Trying to create a chat application in Visual Studio 2010

I am a beginner in networking but I have to start with something, so I decided to create a chat app in visual studio 2010 using C# language (winforms).
I googled a lot about that and I've found almost exactly what I needed.
I found the following code samples (in C# - console):
http://msdn.microsoft.com/en-us/library/system.net.sockets.tcpclient.aspx
http://msdn.microsoft.com/en-us/library/system.net.sockets.tcplistener(v=VS.71).aspx
I want to create that application using TCP protocol (I don't know if there are easier ways to do that, but I understood the basics of TCP when I tried to create that chat in C#.
When I executed the code samples in the links above, they worked! So I tried to adapt those samples at my chat application.
My chat application consists actually of two apps: a server and a client. Both of them have the same GUI (two text boxes, a button and two labels for displaying whether the client is connected to the server).
textBox1 on the server/client app is the one that display the message sent by the client/server app.
In the textBox2 on the server/client app the user types a message and then presses the button to send the message to the client/server app.
Let me show you what I've tried until now:
This is the server application code.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets;
namespace Server_TCP_WINFORMS
{
public partial class Form1 : Form
{
//Int32 port = 13000;
IPAddress localAddr = IPAddress.Parse("127.0.0.1");
TcpListener server = new TcpListener(IPAddress.Parse("127.0.0.1"), 13000);
public Form1()
{
InitializeComponent();
server.Start();
}
byte[] bytes = new byte[256];
String data = null;
TcpClient client = new TcpClient();
bool sw = true;
int data_at_byte_level = 0;
private void Form1_Load(object sender, EventArgs e)
{
try
{
label2.Text = "Waiting for an incoming connection...";
if (!server.Pending())
{
label2.Text = "For moment, there are no connections requests!";
}
else
{
client = server.AcceptTcpClient();
label2.Text = "Connected!";
sw = false;
}
}
catch (SocketException xyz)
{
MessageBox.Show("Exception occured!");
}
if (sw == false)
{
NetworkStream stream = client.GetStream();
while ((data_at_byte_level = stream.Read(bytes, 0, bytes.Length)) != 0)
{
data = System.Text.Encoding.ASCII.GetString(bytes);
textBox1.Text += data;
data = null;
bytes = null;
}
}
}
private void button1_Click(object sender, EventArgs e)
{
String dataT;
if (textBox2.Text!=null && sw == false)
{
NetworkStream stream = client.GetStream();
dataT = textBox2.Text;
byte[] msg = System.Text.Encoding.ASCII.GetBytes(dataT);
stream.Write(msg, 0, msg.Length);
}
}
}
}
And this is the client application code:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Net.Sockets;
using System.Net;
namespace Client_TCP_WINFORMS
{
public partial class Form1 : Form
{
TcpClient client = new TcpClient("127.0.0.1", 13000);
public Form1()
{
InitializeComponent();
label2.Text = "Conected to the server!";
}
private void button1_Click(object sender, EventArgs e)
{
NetworkStream stream = client.GetStream();
if (textBox2.Text != null)
{
String data_str = textBox2.Text;
Byte[] data_byte = System.Text.Encoding.ASCII.GetBytes(data_str);
stream.Write(data_byte, 0, data_byte.Length);
}
}
private void Form1_Load(object sender, EventArgs e)
{
Byte[] data_byte = new Byte[290];
int bytes;
string Data;
NetworkStream stream = client.GetStream();
bytes = stream.Read(data_byte, 0, data_byte.Length);
Data = System.Text.Encoding.ASCII.GetString(data_byte, 0, bytes);
textBox1.Text += Data;
}
}
}
I want that those two apps to behave in the following way: I start the server application then I start the client application. When both of them are open, I want them to be already connected (because it's simpler that way, I think).
Then, I want that both of them to be receptive which means that when the server (for example) sends a message to the client, the latter one should receive the message and display it. If the server send another message, the client should receive and display it too.
If the user (of the client or the user of the server) presses the send button, the application should send the message from the textBox2 to the other application. How can I do those things in windows forms?
I see in the code samples in console that there is a main loop where the server reads the message from the client. But what if the server wants to send a message too? If the send button is pressed, the event for the button_pressed occurs and then it sends the message, but when it finished sending the message, it goes back to the main loop?
Please excuse my english. I am not a native speaker.
Thank you respectfully.
"When both of them are open, I want them to be already connected (because it's simpler that way, I think)."
For this, you need to use UDP(User Datagram Protocol) rather than TCP

Categories

Resources