Страницы

Поиск по вопросам

Показаны сообщения с ярлыком serial. Показать все сообщения
Показаны сообщения с ярлыком serial. Показать все сообщения

пятница, 24 января 2020 г.

Serial Communication DLL

#c_sharp #cpp #dll #serial


Пытаюсь написать dll на С++ для связи с com-портами, где dll будет использоваться
через DllImport в С#.

Код пишется на примере msdn

Для начала я попытался использовать данный пример в консольной аппликации :

static SerialPort^ _serialPort;

static void Main()

    _serialPort = gcnew SerialPort("COM9");

    _serialPort->ReadTimeout = 500;
    _serialPort->WriteTimeout = 500;

    _serialPort->Open();

    _serialPort->WriteLine(String::Format("test"));

    _serialPort->Close();


все замечательно работает (вылавливаю сообщение test через putty), но при попытке
использовать тот же код, но уже через dll: 

static void Main()
{

    SerialPort^ _serialPort = gcnew SerialPort("COM9");

    _serialPort->ReadTimeout = 500;
    _serialPort->WriteTimeout = 500;

    _serialPort->Open();

    _serialPort->WriteLine(String::Format("test"));

    _serialPort->Close();
}

int pOpen()
{
    PortChat::Main();
    return 1;
}


прилетает вот такое вот зло:


  System.UnauthorizedAccessException: Access to the port 'COM9' is
  denied.


Собственно, что я делаю не так? (и вполне вероятно, что я делаю не так ВСЁ из-за
не понимания) 

Стоит добавить что часть C# (которая вызывает dll) работает через JavaScript.
То есть все это несчастье запускается через default.html.

Огромное спасибо.
    


Ответы

Ответ 1



Вы пробовали запускать приложение от имени администратора? Может имеет смысл попробовать реализовать инициализацию последовательного порта средствами winApi (FileRead), там можно и параметры безопасности использовать. Вообще, лучше (наверно) использовать стандартный класс последовательного порта, присутствующий в .NET.

Ответ 2



Проверьте может при компиляции dll "COM9" изменяется (бывают проблемы с кодировкой). Еще как вариант запустите приложение под администратором.

четверг, 23 января 2020 г.

COM Порт в python: как ждать данные, не нагружая CPU

#python #serial #com_порт


Есть программа, которая принимает данные из COM порта. Возникла проблема, как заставить
программу ждать данные и не выполняться дальше? 

При использовании бесконечного цикла while, программа нагружает ЦП до 50%.

forchar = 0
idcom = []

ser = serial.Serial(
    port = 'COM2',\
    baudrate=2400,\
    parity=serial.PARITY_NONE,\
    stopbits=serial.STOPBITS_ONE,\
    bytesize=serial.EIGHTBITS,\
    timeout=0)

print("connected to: " + ser.portstr)
count=1

while True:
    for line in ser.readline():
        forchar = forchar + 1
        idcom.append(line)
    if forchar >= 13:
        break

    


Ответы

Ответ 1



У вас порт настроен на неблокирующее чтение, так как установлен timeout=0, Либо уберите эту опцию, либо напишите timeout=None, тогда порт у вас будет ждать данные, до тех пор пока они не появятся. Если же вам все таки нужно неблокирующее соединение, то в цикл while надо добавить небольшую задержку time.sleep, тогда нагрузка процессора уйдет.

Ответ 2



Еще есть такая конструкция: while True: while ser.inWaiting() == 0: pass #необходимая работа с данными... Тут выполняется проверка на наличие данных в очереди порта. Такой способ ожидания, ЦП не нагружает совсем.

Ответ 3



Так понятнее while ser.inWaiting(): data = ser.read() пока в порте нет данных чтение не выполняетса

Ответ 4



допустим def recCode(data):# и поехали проверять по условиям - например if data == (b'\x05sRR\r\n') print(u'я получил сообщение ') while True: while ser.inWaiting() > 0:# даже если мы поставим без условия data = ser.readline() recCode(data) при таком построении алгоритма while True будет выполнятся постоянно и recCode(data) будет вызываться при приёме каждого символа (байта) в порт, а если 1 количество байтов в пакете не известно(работа по стартовому и конечному символу) или 2 надо ещё обслуживать графический интерфейс и в добавок 3 отправлять данные (сообщения ) в порт , то некоторые символы (принимаемые ) могут потеряться , да и программа (не зависимо сколько ядер у процессора ) будет занята только этим , а если надо 2 порта обслуживать ? в ассемблере (avr контроллеры), в VB6(x86 и 64), есть возможность применения аппаратных прерываний , т е событие (приём символа портом ) может (при правильной настройке аппаратного узла контроллера или машины), остановить выполнение (или перенаправить поток команд) основного тела программы , выполнить подпрограмму (прерывание) приёма одного символа с возможностью формирования строки по стартовым и конечным символам (\х05 и \r\n) и после приёма конечного символа непосредственно в подпрограмме (если условий мало ) обработать - изменив переменные или, выставить флаг готовности принятого сообщения для основной программы , или изменив глобальную переменную для других процессов. тогда while True может заниматься (допустим ) проверкой флагов готовности сообщения одного , второго , н-ого порта , обновлением процессов графической оболочки типа root=Tk() ..(графические элементы ) , и в место root.vfinloop() использовать root.update(), тк как графические интерфейсы управления достаточно медленные процессы

пятница, 27 декабря 2019 г.

Работа с serialport (FTDI) из bash

#linux #bash #serial


Linux, Raspbian 8. 
В USB воткнут преобразователь USB-CAN. Появляется в системе как /dev/ttyUSB0

Сам преобразователь и устройство за ним точно рабочие. 

Требуется послать в порт 4 байта, подождать 200мс и получить ответ в 4 байта.

попробовал вот так:

#!/bin/bash
PORT="/dev/ttyUSB0"
stty -F $PORT 9600

printf '\x0b\x00\x06\x80' > $PORT
sleep 0.2
read -rn 4 data < $PORT
echo $data


На строке с read все зависает. Видимо не получает не каких данных в ответ. Пробовал
менять на 1 входящий символ. Но похоже в ответ полная тишина. 

Правильно ли я вообще работаю с портом? В какую сторону копать?

UPDATE 10.03

что-то нахимичил


теперь все что, отправляю в порт прилетает обратно. Именно то, что отправил но не
то что ожидаю от оборудования
еще странная вещь 

$ stty -F /dev/ttyUSB0
stty: /dev/ttyUSB0: Неприменимый к данному устройству ioctl
$ setserial /dev/ttyUSB0
Cannot get serial info: Inappropriate ioctl for device


    


Ответы

Ответ 1



Для передачи двоичных данных у меня работает следующая настройка порта: stty raw -echo -onlcr -iexten 9600 -F /dev/ttyUSB0 Для usb-serial-преобразователя имя устройства после очередного переподключения иногда может непредсказуемо поменяться с ttyUSB0 на ttyUSB1, ttyUSB2 и т.д.

среда, 25 декабря 2019 г.

Доступ к serial port из nativescript

#android #nodejs #serial #nativescript


Как можно работать на android с usb serial port из nativescript в anroid?
Я не имею представления как работают с ним на java и не могу найти нечего подобного
в api.
Я читал что обычные npm модули не будут работать на nativescript , как тогда вообще
можно докопаться до serial port?
Возможно как то через файловую систему можно долезть до serial port?
    


Ответы

Ответ 1



К сожалению похоже что нету вариантов доступа к serial port из nativescript. Из подобных кросс платформенных библиотек, получить доступ получилось в phonegap, через плагин cordovarduino всё работает, не скажу что идеально, но работает, в отличии от nativescript в котором как оказалось нету доступа к serial port.

Ответ 2



Сам пока не пробовал, но возможно https://code.google.com/archive/p/android-serialport-api/ сможет предоставить доступ к последовательному порту. На сколько я понимаю, суть в том, что девайс будет находиться системой как файл.

среда, 13 марта 2019 г.

COM Порт в python: как ждать данные, не нагружая CPU

Есть программа, которая принимает данные из COM порта. Возникла проблема, как заставить программу ждать данные и не выполняться дальше?
При использовании бесконечного цикла while, программа нагружает ЦП до 50%.
forchar = 0 idcom = []
ser = serial.Serial( port = 'COM2',\ baudrate=2400,\ parity=serial.PARITY_NONE,\ stopbits=serial.STOPBITS_ONE,\ bytesize=serial.EIGHTBITS,\ timeout=0)
print("connected to: " + ser.portstr) count=1
while True: for line in ser.readline(): forchar = forchar + 1 idcom.append(line) if forchar >= 13: break


Ответ

У вас порт настроен на неблокирующее чтение, так как установлен timeout=0, Либо уберите эту опцию, либо напишите timeout=None, тогда порт у вас будет ждать данные, до тех пор пока они не появятся.
Если же вам все таки нужно неблокирующее соединение, то в цикл while надо добавить небольшую задержку time.sleep, тогда нагрузка процессора уйдет.

четверг, 29 ноября 2018 г.

Доступ к serial port из nativescript

Как можно работать на android с usb serial port из nativescript в anroid? Я не имею представления как работают с ним на java и не могу найти нечего подобного в api. Я читал что обычные npm модули не будут работать на nativescript , как тогда вообще можно докопаться до serial port? Возможно как то через файловую систему можно долезть до serial port?


Ответ

К сожалению похоже что нету вариантов доступа к serial port из nativescript Из подобных кросс платформенных библиотек, получить доступ получилось в phonegap, через плагин cordovarduino всё работает, не скажу что идеально, но работает, в отличии от nativescript в котором как оказалось нету доступа к serial port.