Ir para conteúdo
Fórum Script Brasil

cpereira

Membros
  • Total de itens

    9
  • Registro em

  • Última visita

Sobre cpereira

cpereira's Achievements

0

Reputação

  1. cpereira

    Porta COM

    Peço desculpa pela ausência. Obrigado pela resposta. Ainda não experimentei, obrigado pela sugestão. Daria para fazer, mas isso iria causar um efeito não desejado, que é o seguinte: O sistema tem de registar uns valores que vem no pacote no instante em que são recebidos. Ao ser despoletado o evento DataReceived é criado um buffer com os bytes do 1º pacote mais alguns do 2º. Ao deixar o 2º pacote em "standby" iria fazer com que todos os outros pacotes começassem a não ser recebidos por inteiro e então iriam ficar sempre pacotes em "standby". Vou experimentar a solução com a BaseStream e ver no que dá. Abraço
  2. cpereira

    Estado da janela

    Olá a todos. Gostaria de saber se existe algum evento que seja despoletado quando o WindowState é alterado. Já estive a procurar mas não encontrei nada, o que acho muito estranho, deve haver forma de saber se um form foi maximizado/minimizado, certo? Cumprimentos Resolvido Usei o evento Resize
  3. cpereira

    Porta COM

    Olá a todos, estou a desenvolver um projecto onde tenho de ler dados recebidos na porta COM. Estou a usar o System.IO.Ports para trabalhar com a porta COM. O problema é o seguinte: Eu tenho de ler pacotes de 32 bytes, pelo que coloquei a propriedade comPort.ReceivedBytesThreshold = 32;, ou seja, o evento DataReceived só é despoletado quando existirem 32 bytes no buffer para serem lidos. Pelo que percebi, é criado um buffer interno (de software) onde são armazenados os dados e é a esse buffer que o método Read() vai ler os dados. A questão é que em alguns casos poderei receber mais do que um pacote quase ao mesmo tempo, e o que acontece é que não é despoletado um novo evento mas sim o seguinte: - Recebo 1 pacote 32 Bytes - Recebe inicio de outro pacote - Cria buffer interno com >32 Bytes a ler - Despoleta o evento DataReceived - Leio 32 Bytes do 1º pacote, fica o inicio do 2º pacote no buffer da porta COM Ao fazer isto "perco" o inicio do 2º pacote só recebendo o resto na próxima vez que o evento DataReceived for despoletado, ou seja acontece o seguinte: - Detecta 32 Bytes na porta COM - Cria buffer interno com > 32 Bytes a ler - Lê o resto do 2º pacote mais o inicio do 3º, fica o resto do 3º pacote no buffer da porta COM O que vai acontecer é que vou andar sempre "dessincronizado" na recepção dos pacotes. Existe alguma forma de ir ler directamente ao buffer da porta COM e não ao buffer interno que é criado ao serem recebidos dados? Desde já muito obrigado pela atenção
  4. Já descobri o problema. No método addNumeroSerieDesconhecido() não estava a fazer o Release() caso ele entrasse no if. Problema resolvido... Por enquanto :P
  5. Olá a todos, é a primeira vez que estou a trabalhar com semáforos em C#, e também para ser sincero nunca semáforos nunca foi o meu forte. A questão é a seguinte, tenho uma classe estática que vai guardando informação durante o decorrer da aplicação. A essa classe poderão aceder várias threads, e claro existem zonas criticas. Basicamente estou a fazer um sem.WaitOne() quando vou ler/escrever nas zonas criticas e depois faço o sem.Release(). O problema é que a uma determinada altura fica tudo bloqueado, parece uma situação de Deadlock, fica tudo à espera que haja um release. Aqui fica a classe, se pudessem dar uma vista de olhos e comentar o que está mal agradecia, pois como já referi há pouco não tenho muita experiência com semáforos. Desde já agradeço a vossa atenção. class DadosActuais { static Semaphore sem = new Semaphore(1, 1); static ArrayList numeroSerieDesconhecidos = new ArrayList(); static ArrayList numeroSerieConhecidos = new ArrayList(); /// <summary> /// Adiciona um novo nº de série à lista de nº de série conhecidos /// </summary> /// <param name="numeroSerie">Nº de série a adicionar</param> public static void addNumeroSerieConhecido(string numeroSerie) { sem.WaitOne(); numeroSerieConhecidos.Add(numeroSerie); sem.Release(); } /// <summary> /// Adiciona um novo nº de série à lista de nº de série desconhecidos /// </summary> /// <param name="numeroSerie"></param> public static void addNumeroSerieDesconhecido(string numeroSerie) { sem.WaitOne(); foreach (string nSerie in numeroSerieDesconhecidos) { if (nSerie.CompareTo(numeroSerie) == 0) return; } numeroSerieDesconhecidos.Add(numeroSerie); sem.Release(); } /// <summary> /// Limpa a lista de nº de série desconhecidos /// </summary> public static void limpaNumeroSerieDesconhecido() { sem.WaitOne(); numeroSerieDesconhecidos.Clear(); sem.Release(); } /// <summary> /// Obtém o indice da posição em que se encontra guardado o nº de série do equipamento /// </summary> /// <param name="numeroSerie">Nº de série do equipamento</param> /// <returns>Devolve o indice em que se encontra guardade o equipamento</returns> private static int getIndiceEquipamento(string numeroSerie) { int i = 0; foreach (string nSerie in numeroSerieConhecidos) { if (nSerie.CompareTo(numeroSerie) == 0) return i; i++; } return i; } /// <summary> /// Guarda os nº de série registados na base de dados /// </summary> /// <param name="lista">Lista com equipamentos registados na base de dados</param> public static void carregaDados(ArrayList listaEq) { foreach (Equipamento eq in listaEq) { addNumeroSerieConhecido(eq.numeroSerie); } } /// <summary> /// Verifica se o nº de série é de um equipamento conhecido /// </summary> /// <param name="numeroSerie">Nº de série</param> /// <returns>Devolve true caso o nº de série pertença a um equipamento conhecido ou false caso contrário</returns> public static bool verificaExisteConhecido(string numeroSerie) { sem.WaitOne(); foreach (string nSerie in numeroSerieConhecidos) { if (nSerie.CompareTo(numeroSerie) == 0) { sem.Release(); return true; } } sem.Release(); return false; } /// <summary> /// Verifica se o nº de série é de um equipamento desconhecido /// </summary> /// <param name="numeroSerie">Nº de série</param> /// <returns>Devolve true caso o nº de série pertença a um equipamento desconhecido ou false caso contrário</returns> public static bool verificaExisteDesconhecido(string numeroSerie) { sem.WaitOne(); foreach (string nSerie in numeroSerieDesconhecidos) { if (nSerie.CompareTo(numeroSerie) == 0) { sem.Release(); return true; } } sem.Release(); return false; } }
  6. Bem, já encontrei resposta ao meu problema. Ao que parece o Visual Studio 2008 Express Edition não permite fazer o que quero. De qualquer forma já encontrei outra maneira de fazer o que queria. Uso um software para criar setup wizards que ao verificar que não estão instalados os pré-requisitos executa os setups.
  7. Isto está dificil, continua a não dar :( Já fiz o download dos seguintes 3 ficheiros: - dotNetFx35setup.exe - SSCERuntime-PTB-x86.msi - WindowsInstaller-KB893803-v2-x86.exe que são os setups respectivamente da framework .Net 3.5 SP1, Sql Server Compact 3.5 e Windows Installer 3.1 (que são os pré-requisitos). Já escolhi a opção "Download prerequisites from the following location" e indiquei o caminho "\\prerequisites\setups", mas ainda assim continua a dar o mesmo problema :unsure:
  8. Obrigado pela resposta quintelab . Em relação ao problema da comunicação com a porta COM já dei uma olhada nos artigos e pareceram-me bastante bons, eles estão em VB mas eu estou a trabalhar em C#, mas não há problema irei conseguir começar a fazer alguma coisa a partir deles. Em relação ao publish da app, eu não defini nenhum caminho para os ficheiros. A ideia é publicar num CD a app, daí que eu queira que os ficheiros sejam descarregados da mesma localização da app. Estarei a fazer confusão? Se eu definir um caminho quando estiver a instalar a app o setup irá procurar os ficheiros sempre no caminho que defini não é? Obrigado pela atenção Abraço
  9. Olá a todos, Tenho 2 dúvidas que são as seguintes: 1) Gostava de fazer o publish da minha aplicação. Já fiz os passos necessários para o fazer, no entanto na escolha dos prerequisitos da app preferia escolher a opção "Download prerequisites from the same location as my application" em vez de fazer download do website do vendedor. Os pre-requisitos da minha app são a framework .Net 3.5, o Windows Installer 3.1 e o Sql Server Compact 3.5. Já fiz download dos 3 setups e coloquei-os na raiz do projecto. A questão é que quando escolho a opção pretendida e faço publish now, dá-me erro a dizer que não encontra os ficheiros. The install location for prerequisites has not been set to 'component vendor's web site' and file 'WindowsInstaller-KB893803-v2-x86.exe' in item 'Windows Installer 3.1' can not be located on disk. Alguém me poderia dar uma ajuda? 2) Brevemente terei que iniciar o desenvolvimento de um projecto em que irei receber dados pela porta COM, no entanto nunca o fiz e não tenho ideia de como poderei fazer. Estou a pensar criar uma thread que ficará sempre à escuta da porta a ver se houve alguma interrupção, será esta uma boa solução? Alguém conhece um sitio onde possa encontrar um tutorial de como posso ficar à escuta da porta COM? Desde já agradeço a vossa atenção. CPereira
×
×
  • Criar Novo...