Форум программистов, компьютерный форум, киберфорум
Visual Basic .NET
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.55/47: Рейтинг темы: голосов - 47, средняя оценка - 4.55
7 / 7 / 0
Регистрация: 09.04.2013
Сообщений: 86
1

Чтение/передача данных через USB порт

07.11.2014, 10:19. Просмотров 9516. Ответов 14
Метки нет (Все метки)

Задача такова: есть внешний микроконтроллер (Arduino) который связан с ПК ч/з USB (некоторый COM-порт) и вот нужно принимать инфу или её посылать на дуину. Как это делается в Arduino IDE описано, а мне жизненно необходимо иметь приложение на .net считывающее и посылающее данные ч/з USB(COM)
Сразу оговорюсь, мне не нужно прошивать дуинку, она прошита, мне нужно корректировать её работу и считывать показание датчиков.

Нашёл одну тему (и ещё несколько), а никаких ответов нет. Собственно и код этот не работает
vb.net
1
2
3
4
5
6
7
8
9
10
Private Sub Button_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button.Click
        Dim SerialPort1 As System.IO.Ports.SerialPort
        'Dim SerialPort2 As SerialPort                                                            <- не знает VB2010 что такое SerialPort
        SerialPort1 = New SerialPort("COM3", 9600, Parity.None, 8, StopBits.One) <-
        SerialPort1.Open()
 
        Dim aa As String = SerialPort1.ReadLine()
        ListBox1.Items.Add(aa)
        SerialPort1.Close()
    End Sub
Добавлено через 12 минут
про библиотики забыл теперь код работает
2
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.11.2014, 10:19
Ответы с готовыми решениями:

COM-USB приём, передача данных
Добрый день! Такая проблема: данные с микроконтроллера ATMEGA 128 идут по RS232C после чего...

Прием данных через COM порт
Доброго времени суток Всем ! У меня такой вопрос помогите разобраться с приемом данных с COM...

Получение данных по запросу через COM Порт
Добрый день. Сначала немного опишу общую картину. Имеется электронная индикаторная головка с...

Передача данных между программами через TCP/IP
При передаче через сокет между двумя прогами на одном компе (т.е. на адрес 127.0.0.1) все данные...

14
10210 / 6591 / 494
Регистрация: 28.12.2010
Сообщений: 21,165
Записей в блоге: 1
07.11.2014, 10:25 2
...данный код будет работать, если в буфере порта уже есть данные, либо они шлются постоянно и момент чтения не совпал с таймаутом посылки, ибо в коде нет даже минимальной задержки. Если на момент чтения порта устройство еще ничего не послало, то ничего принято и не будет.

Читать следует либо в потоке асинхронно после однократного открытия порта, либо читать, используя собственное событие прихода данных (собственный поток) обертки SerialPort. Закрывать порт следует по завершению приложения.
0
827 / 635 / 100
Регистрация: 20.08.2013
Сообщений: 2,524
07.11.2014, 13:58 3
Цитата Сообщение от raxp Посмотреть сообщение
...данный код будет работать, если в буфере порта уже есть данные, либо они шлются постоянно
С чего бы это?
Цитата Сообщение от http://msdn.microsoft.com/ru-ru/library/system.io.ports.serialport.readline(v=vs.110).aspx
По умолчанию выполнение метода ReadLine блокируется до получения строки. Если такое поведение нежелательно, присвойте свойству ReadTimeout любое ненулевое значение, чтобы метод ReadLine сгенерировал исключение TimeoutException при отсутствии строки в порте.
0
10210 / 6591 / 494
Регистрация: 28.12.2010
Сообщений: 21,165
Записей в блоге: 1
07.11.2014, 18:19 4
...а с того, что после получения первой порции данных порт будет закрыт.
0
827 / 635 / 100
Регистрация: 20.08.2013
Сообщений: 2,524
07.11.2014, 19:45 5
И что?
При чём тут вообще закрытие, если ты говоришь, что данные должны уже быть на момент чтения?
И куда ты хочешь поместить задержку? Тут же нет цикла.
0
10210 / 6591 / 494
Регистрация: 28.12.2010
Сообщений: 21,165
Записей в блоге: 1
08.11.2014, 10:28 6
...я не говорил, что они должны быть, а сказал, что могут быть, а могут не быть. После первой же строки данных, по MSDN, порт будет закрыт. Для непрерывного чтения следует использовать собственное событие приема данных класса или читать в отдельном потоке.
0
827 / 635 / 100
Регистрация: 20.08.2013
Сообщений: 2,524
08.11.2014, 11:21 7
Цитата Сообщение от raxp Посмотреть сообщение
я не говорил, что они должны быть, а сказал, что могут быть, а могут не быть.
Цитата Сообщение от raxp Посмотреть сообщение
данный код будет работать, если в буфере порта уже есть данные, либо они шлются постоянно и момент чтения не совпал с таймаутом посылки, ибо в коде нет даже минимальной задержки. Если на момент чтения порта устройство еще ничего не послало, то ничего принято и не будет.
Вроде как противоречие, не?
0
10210 / 6591 / 494
Регистрация: 28.12.2010
Сообщений: 21,165
Записей в блоге: 1
08.11.2014, 11:34 8
Либо, либо, нет противоречия.
0
827 / 635 / 100
Регистрация: 20.08.2013
Сообщений: 2,524
09.11.2014, 01:12 9
Есть, но не в этой части фразы...
0
7 / 7 / 3
Регистрация: 14.03.2013
Сообщений: 104
09.11.2014, 08:15 10
vb.net
1
2
3
4
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        SerialPort1.Open()
        SerialPort1.Write("Данные")
    End Sub
отправка в ардуину
0
65 / 39 / 3
Регистрация: 07.12.2010
Сообщений: 328
09.12.2015, 16:04 11
Хотелось бы тему поднять. Лазию по инету уже второй день. Пока не получается найти правильный ответ. Есть Arduino и LCD дисплей. Скетч залитый. При посылке 1 - пишется "ОК" при посылке 2 "URA", но вот с посылкой проблема. Через монитор порта рабочает, а вот с кодом на VB - немного не доганяю.

vb.net
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
Public Class Form1
    Public Property SerialPort1 As Object
 
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        If SerialPort1.IsOpen Then
            SerialPort1.RtsEnable = False
            SerialPort1.DtrEnable = False
            SerialPort1.Close()
 
            Application.DoEvents()
        End If
 
        'set port setting
        SerialPort1.PortName = "COM3"
        SerialPort1.BaudRate = 9600
        SerialPort1.DataBits = 8
        SerialPort1.Parity = 0
        SerialPort1.StopBits = IO.Ports.StopBits.One
        'SerialPort1.WriteTimeout = 1000
        'SerialPort1.ReadTimeout = 1000
        'SerialPort1.Encoding = System.Text.Encoding.Default
 
 
        SerialPort1.Open()
    End Sub
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        SerialPort1.Open()
        SerialPort1.Write(TextBox1.Text)
        SerialPort1.Close()
 
    End Sub
End Class
Помогите поправить. Код компилиться, но выскакивает обратно в среду. Не запускается.

Добавлено через 2 часа 54 минуты
сергей нт, По поводу данных. Посылаю в ардуину символ "s" - отображает - "115". Посылаю "0" - отображает "48". Как мне послать строку и чтоб она же и отобразилась?
0
7 / 7 / 0
Регистрация: 09.04.2013
Сообщений: 86
11.12.2015, 03:42  [ТС] 12
В Ардуинке плоховато с типом String, она разбивает его на символы типа char и вот здесь может возникать загвоздка. Попробуйте отправлять посимвольно, причем именно в кодировке ASCII.

Добавлено через 1 минуту
Не забудь отписаться, что получилось
0
65 / 39 / 3
Регистрация: 07.12.2010
Сообщений: 328
11.12.2015, 15:41 13
Ни стал заморачиваться. По примерам нашёл скетч - работает как надо:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
/*
 * Displays text sent over the serial port (e.g. from the Serial Monitor) on
 * an attached LCD.
 * YWROBOT
 *Compatible with the Arduino IDE 1.0
 *Library version:1.1
 */
#include <Wire.h> 
#include <LiquidCrystal_I2C.h>
 
LiquidCrystal_I2C lcd(0x27,20,4);  // set the LCD address to 0x27 for a 16 chars and 2 line display
 
void setup()
{
  lcd.init();                      // initialize the lcd 
  lcd.backlight();
  Serial.begin(9600);
}
 
void loop()
{
  // when characters arrive over the serial port...
  if (Serial.available()) {
    // wait a bit for the entire message to arrive
    delay(100);
    // clear the screen
    lcd.clear();
    // read all the available characters
    while (Serial.available() > 0) {
      // display each character to the LCD
      lcd.write(Serial.read());
    }
  }
Библиотеку прилагаю...
0
Вложения
Тип файла: rar LiquidCrystal_I2C-master.rar (16.3 Кб, 24 просмотров)
65 / 39 / 3
Регистрация: 07.12.2010
Сообщений: 328
11.12.2015, 16:06 14
Вот код самой программы на всякий случай:
vb.net
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
Public Class Form1
    Dim SerialPort1 As New SerialPort()
 
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        If SerialPort1.IsOpen Then
            SerialPort1.RtsEnable = False
            SerialPort1.DtrEnable = False
            SerialPort1.Close()
 
            Application.DoEvents()
        End If
 
        'set port setting
        SerialPort1.PortName = "COM3"
        SerialPort1.BaudRate = 9600
        SerialPort1.DataBits = 8
        SerialPort1.Parity = 0
        SerialPort1.StopBits = IO.Ports.StopBits.One
        'SerialPort1.WriteTimeout = 1000
        'SerialPort1.ReadTimeout = 1000
        'SerialPort1.Encoding = System.Text.Encoding.Default
        SerialPort1.Encoding = ASCIIEncoding.Default
 
 
        'SerialPort1.Open()
    End Sub
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        SerialPort1.Open()
        SerialPort1.Write(TextBox1.Text)
        SerialPort1.Close()
 
    End Sub
End Class
0
7 / 7 / 0
Регистрация: 09.04.2013
Сообщений: 86
16.12.2015, 06:12  [ТС] 15
А если данные не приходят, программа висит?
Можно сделать по событию прихода данных.
Добавить на форму SerialPort и такой код:
vb.net
1
2
3
4
5
6
Private Sub SerialPort1_DataReceived(sender As System.Object, e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
        Dim sp As SerialPort = CType(sender, SerialPort)
        Dim indata As String = sp.ReadExisting()  ' собственно полученные данные
        MsgBox(indata)
        SerialPort1.Close()
    End Sub
3
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.12.2015, 06:12

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Чтение и запись любых данных через FileStream + шифрование
Здравствуйте. Скажите как можно записывать и читать любые данные через FileStream + используя...

Передача сообщения в порт
lpOVERLAPPED - имя экземпляра структуры: Public Structure OVERLAPPED Public...

Чтение данных из файла и их передача через порт компьютера
Добрый день. Есть задача: в текстовый файл в реальном времени пишется поток данных (углы...

Подключение/чтение/отправка данных на сторонние устройства через usb COM порт
сабж: как подключить к андроид устройству сторонние девайсы по COM порту и впоследствии...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.