Регистрация | Вход

[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 2
  • 1
  • 2
  • »
Форум Picbasic.ru » Программирование на ПК » Программирование на Basic » VB 2010: COM порт (Проблема при приеме информации с COM порт)
VB 2010: COM порт
xxxmonejall Дата: Вт, 03.01.2012, 01:39  |                                                                                                                Сообщение # 1
Группа: Проверенные
Ранг:  Продвинутый
Сообщений: 139
Репутация: 0   ±
Замечания:   ±
На сайте с 17.05.2008

Статус: Offline

Доброго времени суток.
В программирование полный ноль:)
Так что сильно не пинайте. задача состоит в том что нужно принимать данные с ком порта, и рисовать по них график.
Все вроде бы работает, с микроконтроллера данные посылаются, моя программа их принимает.Но замечен глюк от 0 до 99 график рисуется, но только переходит за 100 начинаются глюки. Прилагаю фото графика и сам исходник. Может кто что подскажет, извините если что не так Но это первая моя программа на ПК. Раньше никогда не писал. Да и еще с контролера данные идут такие как нужно смотрел через терминал.

include "MODEDEFS.BAS"
@ device pic16F84A, xt_osc, wdt_off, protect_off, pwrt_on
Define CHAR_PACING 500
DEFINE OSC 4
Trisb = %00000000
diodes var word
diodes = 0
main:

diodes = diodes + 1

serout portb.1, T9600, [#diodes,13]
pause 50
portb.3 = 1
pause 50
portb.3 = 0
pause 50

goto main


______________________________________________________________________________________________________________
Public Class TEST

Dim data_from_port As String = 0
Public Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Control.CheckForIllegalCrossThreadCalls = False


End Sub

Public Sub Chart1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Chart1.Click

End Sub

Public Sub ComboBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ComboBox1.SelectedIndexChanged

End Sub

Public Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
SerialPort1.PortName = ComboBox1.Text
SerialPort1.BaudRate = ComboBox2.Text
SerialPort1.WriteTimeout = 500
SerialPort1.ReadTimeout = 500
SerialPort1.StopBits = ComboBox3.Text
SerialPort1.DataBits = ComboBox4.Text
SerialPort1.Open()

If SerialPort1.IsOpen = True Then
Button2.Visible = True
End If
If SerialPort1.IsOpen = True Then
Button1.Visible = False
End If
End Sub

Public Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
If SerialPort1.IsOpen = True Then
SerialPort1.Close()
End If
If SerialPort1.IsOpen = False Then
Button2.Visible = False
End If
If SerialPort1.IsOpen = False Then
Button1.Visible = True
End If

End Sub

Public Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click

End Sub

Public Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged

End Sub

Public Sub SerialPort1_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived

data_from_port = SerialPort1.ReadExisting()
TextBox1.Text = data_from_port
Chart1.Series("Форсунка 1").Points.AddY(data_from_port)

End Sub

Private Sub ComboBox4_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ComboBox4.SelectedIndexChanged

End Sub

Private Sub ComboBox3_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ComboBox3.SelectedIndexChanged

End Sub

Private Sub Label1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Label1.Click

End Sub

Private Sub Label4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Label4.Click

End Sub
End Class
Прикрепления: 3253849.jpg (55.6 Kb) · WindowsApplicat.zip (135.6 Kb) · UNTITLED.hex (1.1 Kb) · Untitled.pbp (0.3 Kb)
ЯНДЕКС Дата: 03.01.2012
ADMIN Дата: Вт, 03.01.2012, 18:50  |                                                                                                                Сообщение # 2
Администратор
Группа: Администраторы
Ранг:  Специалист
Сообщений: 1087
Репутация: 32   ±
Замечания:   ±
На сайте с 20.08.2007

Статус: Offline

Надо при отладке смотреть что попадает в data_from_port.
Скорей всего дело в строке:
Chart1.Series("Форсунка 1").Points.AddY(data_from_port)
Разве точка добавляется как String?
xxxmonejall Дата: Чт, 05.01.2012, 11:07  |                                                                                                                Сообщение # 3
Группа: Проверенные
Ранг:  Продвинутый
Сообщений: 139
Репутация: 0   ±
Замечания:   ±
На сайте с 17.05.2008

Статус: Offline

Я это уже пробовал менять:( Ничего не вышло. Гипер терминалом с контролера все гуд. А тут на тебе:( Может с настройкой порта что-то, слышал что есть такая штука как проверка четности и бытности ну или что-то типа того. Но как с с этим работать не знаю.
ADMIN Дата: Чт, 05.01.2012, 17:51  |                                                                                                                Сообщение # 4
Администратор
Группа: Администраторы
Ранг:  Специалист
Сообщений: 1087
Репутация: 32   ±
Замечания:   ±
На сайте с 20.08.2007

Статус: Offline

Что пробовал менять? И что не вышло? Если гипертерминалом все ОК, то причем тут четность?
Я говорю, что нужно запустить приложение пошагово и передавать в COM данные. И пошагово смотреть, что попадает в Chart после 99.
xxxmonejall Дата: Пт, 06.01.2012, 23:21  |                                                                                                                Сообщение # 5
Группа: Проверенные
Ранг:  Продвинутый
Сообщений: 139
Репутация: 0   ±
Замечания:   ±
На сайте с 17.05.2008

Статус: Offline

Все:) Наконец то понял в чем проблема:
поменял DEFINE char_pacing 1000 на 100 (задержка между передачей знаков на МК)
А в программе на ПК SerialPort1.ReadTimeout = 10000
И все как-бы заработало, но замечены все же не приятные глюки. Збои начались после числа 400. Радует только то что ясна причина:)
Есть еще один вопросик: можно ли сделать так чтобы мк отправил что-то и ждал пока с ПК не придет команда что данные получены, и аж тогда отправлял следующие данные дальше, и чтоб та же история была на пк?
ADMIN Дата: Сб, 07.01.2012, 05:23  |                                                                                                                Сообщение # 6
Администратор
Группа: Администраторы
Ранг:  Специалист
Сообщений: 1087
Репутация: 32   ±
Замечания:   ±
На сайте с 20.08.2007

Статус: Offline

Я вот не понимаю - 'вроде бы заработало, но как-бы глючит'. Насчет второго вопроса - у команды serout есть модификатор 'wait'
xxxmonejall Дата: Сб, 07.01.2012, 18:38  |                                                                                                                Сообщение # 7
Группа: Проверенные
Ранг:  Продвинутый
Сообщений: 139
Репутация: 0   ±
Замечания:   ±
На сайте с 17.05.2008

Статус: Offline

Quote
Насчет второго вопроса - у команды serout есть модификатор 'wait'

Синтаксис команды serout: serout Pin, mode, [Item {, Item...}] По книге хилинского.
Так где там есть wait??? Вот в serout2 есть такая штука как FlowPin, вот это как раз то что мне нужно. Или я просто что-то не так понял?
ADMIN Дата: Сб, 07.01.2012, 19:55  |                                                                                                                Сообщение # 8
Администратор
Группа: Администраторы
Ранг:  Специалист
Сообщений: 1087
Репутация: 32   ±
Замечания:   ±
На сайте с 20.08.2007

Статус: Offline

Извиняюсь, оговорился. Конечно, не у команды SEROUT, а у команды SERIN2. То есть, команда serin2, в которой можно указать модификатор Wait, будет ожидать указанную в модификаторе последовательность в течение определенного времени и перейдет на метку, в зависимости от результата. Насчет FlowPin не разбирался, не знаю.
ADMIN Дата: Сб, 07.01.2012, 20:18  |                                                                                                                Сообщение # 9
Администратор
Группа: Администраторы
Ранг:  Специалист
Сообщений: 1087
Репутация: 32   ±
Замечания:   ±
На сайте с 20.08.2007

Статус: Offline

Кстати здесь есть пример с использованием этого модификатора, правда на протоне и с командой HSERIN. Думаю, смысл будет понятен
xxxmonejall Дата: Чт, 23.02.2012, 00:27  |                                                                                                                Сообщение # 10
Группа: Проверенные
Ранг:  Продвинутый
Сообщений: 139
Репутация: 0   ±
Замечания:   ±
На сайте с 17.05.2008

Статус: Offline

Доброго времени суток. Есть вопрос:
С устройства на микроконтроллере по УСАРТ приходит куча разной информации в таком виде: F1 = 21321, F2 = 3434, F3 = 654645, F4 = 23423, RPM = 3434 и еще кучу всего. ловлю все это на пк и вывожу в TextBох, и там это все это вижу так-же все это можно записать в переменную и что угодно с этим делать. Как на Basice можно это все отфильтровать, как значение после F1 = записать в переменную F1, а значение после F2 = в переменную F2 и тд... Может кто что посоветует???
DAlexV Дата: Чт, 23.02.2012, 11:59  |                                                                                                                Сообщение # 11
Группа: Проверенные
Ранг:  Разобрался
Сообщений: 657
Репутация: 27   ±
Замечания:   ±
На сайте с 13.05.2008

Статус: Offline

В VB6 есть функция SPLIT. В VB2010 наверное то же есть. Гонишь данные через в числовом виде через запятую например. Апосля чего запускаешь функцию SPLIT и получаешь массив с разделенными данными. Работает быстрее чем MID$
http://www.picbasic.ru/forum/9-141-1529-16-1234283755 (спасибо ALEXу, за подсказку)

a() = Split(C_Port.Data_Resive, ",")

Res_Data.Dat_A = Val(Trim(a(0))) / 10
Res_Data.Dat_B = Val(Trim(a(1))) / 10
Res_Data.Dat_C = Val(Trim(a(2))) / 10
Res_Data.PID = Val(Trim(a(3)))

пример для изучения http://www.picbasic.ru/forum/9-141-2291-16-1243695810 (VER4.rar)

Успехов wink


Будьте оригинальны-не повторяйте чужих ошибок ! Рыба сдохла. Теперь STM32(TS)+C#(VS).Старею :)
ЯНДЕКС Дата: 23.02.2012
xxxmonejall Дата: Сб, 25.02.2012, 03:05  |                                                                                                                Сообщение # 12
Группа: Проверенные
Ранг:  Продвинутый
Сообщений: 139
Репутация: 0   ±
Замечания:   ±
На сайте с 17.05.2008

Статус: Offline

Большое спасибо.... буду разбираться:)
MiXaS Дата: Чт, 15.05.2014, 22:45  |                                                                                                                Сообщение # 13
Группа: Проверенные
Ранг:  Разобрался
Сообщений: 550
Репутация: 27   ±
Замечания:   ±
На сайте с 02.10.2010

Статус: Offline

Здрасте господа! Решил не создавать новую тему, так как вопрос с темой схож. Начал осваивать компанент MSComm в Visual Basic 6.0. Порт настроил, открыл, все работает отлично, но данные передает в ASCII коде, ну или строковую переменную шлет. Вопрос, как заставить MScomm1.Output слать к примеру в hex или dec. MScomm.Output ест только string. Спасибо
DAlexV Дата: Пт, 16.05.2014, 00:47  |                                                                                                                Сообщение # 14
Группа: Проверенные
Ранг:  Разобрался
Сообщений: 657
Репутация: 27   ±
Замечания:   ±
На сайте с 13.05.2008

Статус: Offline

Цитата MiXaS ()
Вопрос, как заставить MScomm1.Output слать к примеру в hex или dec.
Да все просто. Склеить все данные для передачи в одну строку и отдать ее на растерзание smile буферу передатчика MScomm.

Dim STRout as string

STRout="" ' не забывать чистить переменную перед занесением в нее новых данных
STRout=chr$(13)+chr$(10)+chr$(255)+chr$(13) ' где chr$("то что в скобках и есть данные")

MSComm1.Output =STRout

ссылка в помощь: http://support.microsoft.com/kb/158008/ru

Успехов wink
MiXaS Дата: Вт, 10.06.2014, 13:38  |                                                                                                                Сообщение # 15
Группа: Проверенные
Ранг:  Разобрался
Сообщений: 550
Репутация: 27   ±
Замечания:   ±
На сайте с 02.10.2010

Статус: Offline

DAlexV, спасибо! Сейчас попробую!

Добавлено (16.05.2014, 13:35)
---------------------------------------------
Действительно работает! Спасибо!

Добавлено (09.06.2014, 18:21)
---------------------------------------------
В продолжение темы. Перешел на VB2010. Пытаюсь связать 18f2550 с VB2010 по 232(про юсби знаю, но задача другая). Все вяжется, передается и принимается, только есть одно НО. Я решил не заморачиваться и использовал готовый протокол связи MoDBus RTU. Так вот, при запросе с компа на чтение параметров, в контроллер прилетает все четко, например запрос: 01 03 00 00 00 08 44 0С, контроллер распознает запрос, проверяет CRC и формирует ответ. Ответ приходит правильный за исключением последнего байта CRC. Последние 2 байта в 12 байтной посылке иногда приходят правильные, но это примерно через 5 раз. Когда приходит не правильные данные возвращается код 3f, что соответсвует вопросительному знаку ascii. Также я понял что это связанно со свойством ParityReplace = 63 это свойство прописано по умолчанию. Дело в том, что до не давнего времени все работало, а потом в одночасье перестало и не могу найти причину, уже другой проект создал, но диагноз тот же. С помощью COmPump проверяю, все четко приходит, 100% данных приходят, делал куча запросов. А вот VB2010 сопротивляется и все. Есть подозрение, что идет рассинхронизация, что ли, (я знаю что интерфейс асинхронный).

SerialPort1.PortName = "COM3"
SerialPort1.BaudRate = 9600
SerialPort1.DataBits = 8
SerialPort1.StopBits = IO.Ports.StopBits.One
SerialPort1.Parity = IO.Ports.Parity.None
SerialPort1.WriteTimeout = 500
SerialPort1.ReadTimeout = 500
SerialPort1.Handshake = IO.Ports.Handshake.None

Добавлено (09.06.2014, 19:25)
---------------------------------------------
Так, частично разобрался. Подключил компамп через 232 к своей проге на vb2010, все работает. Начал мучать контроллер. Короче написал жесткий ответ без всяких расчетов, и все работает без ошибок. Остается вопрос что происходит с контроллером. Как-то я уже поднимал вопрос на эту тему. Короче в 2 словах:

ЕUsart настроен на прерывание,

В прерывании заполняется буфер притятых данных с порта. Здесь вопросов нет, все работает отлино.

Когда основной код не большой, скажем просто вывести на LCD 2 строки(смотрю что прилетело в порт), то тут происходит самое интересное. То данные не все прилетают, то часть теряется, то не могу отправить в порт обратно (Hserout или TXREG = ни то ни то не работает), пока не поставлю задержку в 15-100 мс сек в основном коде. Но это мне не подходит. Declare FSR_CONTEXT_SAVE = On объявил, Context Save и Context restory тоже есть, но не работает. Хоть вешайся. Год назад долбался и не допер и сейчас таже история. Может у кого было подобное, что с этим делать?

Добавлено (10.06.2014, 13:38)
---------------------------------------------
Вот еще инфа. Контроллер бедный уже по всякому перешил. И решил соединить компамп с прогой. Дальше кидаю в порт и смотрю что пришло. Оказалось, что до значения 128($80) все работает как часы, а вот выше 128 и выше приходят вопросы, что делать???? Тут явно visual basic троит, дальше то русские символы должны быть, если учесть ascii. Товарищи знатоки, подскажите в чем соль?!

Форум Picbasic.ru » Программирование на ПК » Программирование на Basic » VB 2010: COM порт (Проблема при приеме информации с COM порт)
  • Страница 1 из 2
  • 1
  • 2
  • »
Поиск: