#c# #string #unity3d #serial-port
#c# #строка #unity3d #последовательный порт
Вопрос:
Что ж, я звоню, чтобы отправить эти 50 строк, чтобы создать игру, которая выдает приз, поэтому я использую Unity для разработки игр, поэтому моя основная идея — использовать этот код в качестве основы для кода отправки строк код в моей идее почти готов, я думаю, у меня есть некоторые проблемы с сильнонабрал C #. Я действительно новичок в C #, я больше в Java. Поэтому я принимаю все советы
Спасибо
using UnityEngine;
using System.Collections;
using System.IO.Ports;
using System.Threading;
using System;
public class VendComms : MonoBehaviour {
// Action Constants
const string CAB1 = "02 06 00 85 00 01 8e";
const string CAB2 = "02 06 00 85 00 02 8f";
const string CAB3 = "02 06 00 85 00 03 90";
const string CAB4 = "02 06 00 85 00 04 91";
const string CAB5 = "02 06 00 85 00 05 92";
const string CAB6 = "02 06 00 85 00 06 93";
const string CAB11 = "02 06 00 85 00 0b 98";
const string CAB12 = "02 06 00 85 00 0c 99";
const string CAB13 = "02 06 00 85 00 0d 9a";
const string CAB14 = "02 06 00 85 00 0e 9b";
const string CAB15 = "02 06 00 85 00 0f 9c";
const string CAB16 = "02 06 00 85 00 10 9d";
const string CAB17 = "02 06 00 85 00 11 9e";
const string CAB18 = "02 06 00 85 00 12 9f";
const string CAB19 = "02 06 00 85 00 13 a0";
const string CAB21 = "02 06 00 85 00 15 a2";
const string CAB22 = "02 06 00 85 00 16 a3";
const string CAB23 = "02 06 00 85 00 17 a4";
const string CAB24 = "02 06 00 85 00 18 a5";
const string CAB25 = "02 06 00 85 00 19 a6";
const string CAB26 = "02 06 00 85 00 1a a7";
const string CAB27 = "02 06 00 85 00 1b a8";
const string CAB28 = "02 06 00 85 00 1c a9";
const string CAB29 = "02 06 00 85 00 1d aa";
const string CAB31 = "02 06 00 85 00 1f ac";
const string CAB32 = "02 06 00 85 00 20 ad";
const string CAB33 = "02 06 00 85 00 21 ae";
const string CAB34 = "02 06 00 85 00 22 af";
const string CAB35 = "02 06 00 85 00 23 b0";
const string CAB36 = "02 06 00 85 00 24 b1";
const string CAB37 = "02 06 00 85 00 25 b2";
const string CAB38 = "02 06 00 85 00 26 b3";
const string CAB39 = "02 06 00 85 00 27 b4";
const string CAB41 = "02 06 00 85 00 29 b6";
const string CAB42 = "02 06 00 85 00 2a b7";
const string CAB43 = "02 06 00 85 00 2b b8";
const string CAB44 = "02 06 00 85 00 2c b9";
const string CAB45 = "02 06 00 85 00 2d ba";
const string CAB46 = "02 06 00 85 00 2e bb";
const string CAB47 = "02 06 00 85 00 2f bc";
const string CAB48 = "02 06 00 85 00 30 bd";
const string CAB49 = "02 06 00 85 00 31 be";
const string CAB51 = "02 06 00 85 00 33 c0";
const string CAB52 = "02 06 00 85 00 34 c1";
const string CAB53 = "02 06 00 85 00 35 c2";
const string CAB54 = "02 06 00 85 00 36 c3";
const string CAB55 = "02 06 00 85 00 37 c4";
const string CAB56 = "02 06 00 85 00 38 c5";
const string CAB57 = "02 06 00 85 00 39 c6";
const string CAB58 = "02 06 00 85 00 3a c7";
const string CAB59 = "02 06 00 85 00 3b c8";
const string CAB00 = "02 06 00 85 00 00 00";
// Port for connecting to Vending;
System.IO.Ports.SerialPort sp;
//string arrays for sending and recieving bit strings
string[] send, receive;
// string to send when ready
string to_be_sent_;
// bools to continue loops in threads
bool continueReading_;
bool continueWriting_;
//Thread readThread;
// Use this for initialization
void Start () {
sp = new SerialPort();
sp.PortName = "usbserial-14620";
sp.BaudRate = 9600;
sp.Parity = Parity.None;
sp.DataBits = 8;
sp.StopBits = StopBits.One;
sp.Handshake = Handshake.None;
send = new string[1];
receive = new string[1];
this.to_be_sent_ = CAB00;
//sp.DataReceived = get_serial_data;
try
{
sp.Open();
Debug.Log("Puerto Abierto");
//// Setup the thread to poll the port on
Thread readThread = new Thread(new ThreadStart(get_serial));
this.continueReading_ = true;
readThread.Start();
}
catch (Exception e)
{
Debug.Log("Error abriendo el Puerto: " e.Message);
}
}
string get_command(string command)
{
if (command == CAB1)
return "Gabinete 1";
else if (command == CAB2)
return "Gabinete 2";
else if (command == CAB3)
return "Gabinete 3";
else if (command == CAB4)
return "Gabinete 4";
else if (command == CAB5)
return "Gabinete 5";
else if (command == CAB6)
return "Gabinete 6";
else
return "Comando Desconocido..";
}
void get_serial()
{
while (continueReading_)
{
//sp.Read(receive, 0, 1);
// RECEIVING STRINGS
receive[0] = (string)sp.ReadByte();
Thread.Sleep(20);
sp.DiscardInBuffer();
UnityEngine.MonoBehaviour.print("Recibiendo: " get_command(receive[0]));
}
}
void OnDisable()
{
sp.Close();
}
// Update is called once per frame
void Update () {
// Set the signal to be sent
if (Input.GetKeyDown(KeyCode.A))
{
this.to_be_sent_ = CAB1;
}
if (Input.GetKeyDown(KeyCode.B))
{
this.to_be_sent_ = CAB2;
}
if (Input.GetKeyDown(KeyCode.C))
{
this.to_be_sent_ = CAB3;
}
if (Input.GetKeyDown(KeyCode.D))
{
this.to_be_sent_ = CAB4;
}
// Send the signal
if (this.to_be_sent_ != CAB00)
{
//> set the string to be sent
send[0] = (string)this.to_be_sent_;
// Write to the lamp
sp.WriteLine(send, 0, 1 );
sp.DiscardOutBuffer();
print("Enviado: " get_command(send[0]));
this.to_be_sent_ = (string)CAB00;
}
}
}
Комментарии:
1. Имя порта должно быть похоже
"COM1"
на или"\.COM1"
. Предполагая, что это Windows.2. В настоящее время я работаю на Mac, также я использую TTL для RS232 для связи с машиной
Ответ №1:
receive[0] = (string)sp.ReadByte();
компилируется ли это? Вы не можете преобразовать a byte
в a string
. Похоже, вы хотите создать сообщение из байтов. Вы можете сделать это, заполняя массив по одному байту за раз при чтении с порта. Когда вы получите полное сообщение, преобразуйте процесс в строку.
void get_serial()
{
byte [] receive = new byte[7];
int index = 0;
while (continueReading_)
{
// Read a byte and add to the array
byte data = sp.ReadByte();
if (data == 2) {
index = 0; // Start of msg
}
receive[index ] = data;
// Check for full msg
if (index == 7) {
if (receive[0] == 2) {
// Convert byte array to string
string formattedBytes = String.Concat(receive.Select(i => string.Format("{0:x2} ", i))).Trim();
var cmd = get_command(formattedBytes);
UnityEngine.MonoBehaviour.print("Recibiendo: " cmd);
}
index = 0;
}
}
}
Однако вместо использования потока я предлагаю использовать встроенную SerialPort
функцию обратного вызова. Похоже, вы пробовали это, но прокомментировали.
// sp.DataReceived = get_serial_data;
Раскомментируйте это, потеряйте Thread
и внесите некоторые незначительные изменения get_serial
.
byte [] receive = new byte[7];
int index = 0;
void get_serial_data()
{
while (SerialPort.BytesToRead != 0)
{
byte data = sp.ReadByte();
.... the rest is the same ....
}
}